[原创+连载]一步一步做拼图游戏,C++版(二)

来源:互联网 发布:淘宝客被微信屏蔽了吗 编辑:程序博客网 时间:2024/05/08 23:09

书接上回

三、设计功能

1.定义类
CPuzzleLogic, 用来实现内部逻辑的行为
CPuzzleView, 用来实现视图显示方面的
CPuzzleMain 用来实现主程序,主要是把各部分的联系起来
如果还有其他需要的,以后再定义别的
创建类的时候可以用类向导,不过,VS2008和VS2005里没有,所以用以下方法:
先把解决方案管理器调到类视图里,在项目名称上单击鼠标右键,添加,类
选“C++类”,单击“添加”,在新窗口中写上类名,单击“确定”
如上图,再重复添加其他两个类。
在CPuzzleMain类的头文件上面的#pragma once后面加上
#include "PuzzleLogic.h"
#include "PuzzleView.h"
2.给类相应的功能
先在CPuzzleMain类里添加两个成员变量,分别是其他两个类的类型,用来以后引用里面的功能。
添加方法如下图:
在类视图里右键单击类名称,添加,添加变量
选成private可以防止类外访问到它,写上变量类型和变量名称,然后可以写几句注释
以同样的方法再添加另一个变量,当然,你也可以直接在头文件里写上,效果是一样的,只是这样的做法可以自动初始化系统有的类型,否则有时候会出错。
 
3.添加画图功能
我们设计一个画图的函数,这样的话,以后就不必每次都去写画图函数了
添加函数的方法:在类视图里右键单击类名称,添加,添加函数,参考添加变量的图
在新窗口中输入返回类型,函数名,函数的参数,以及注释等等信息。
这样的好处是点击完成的时候,系统会自动添加到头文件中声明,和.cpp文件中的定义部分。
然后写代码吧。
 
 (1)要先在CPuzzleView里加上两个成员变量
private:
       HWND m_hWnd; //保存窗口句柄
       HBITMAP m_hBmpBack;//保存背景图片
(2)把前面做好的图片复制到源代码文件夹的res文件夹里,如果没有的话,就自己新建一个,当然你也可以写别的名字,不过要自己记住,我这里就以res为例子。
(3)添加以下几个函数
 
Code:
  1. // 画图,hBitmap表示指向图片的指针,x,y表示位图显示的横纵坐标,nWidth,nHeight位图的宽度和高度,srcX,srcY从位图的的哪个位置开始显示  
  2. void CPuzzleView::DrawPic(HBITMAP hBitmap, int x, int y, int nWidth, int nHeight, const int srcX=0, const int srcY=0)   
  3. {   
  4.        HDC hdcMem;                                                                                    //内存DC  
  5.        HDC hdcScr = GetDC(m_hWnd);                             //获取屏幕的DC  
  6.        hdcMem = CreateCompatibleDC(hdcScr);    //创建兼容屏幕的内存DC  
  7.        SelectObject( hdcMem, hBitmap );                            //将图片绑定内存DC上  
  8.        BitBlt( hdcScr, x, y, nWidth, nHeight, hdcMem, srcX, srcY, SRCCOPY ); //将内存DC里的东西画到屏幕上  
  9.        DeleteDC(hdcMem);                                                                     //清除两个DC  
  10.        DeleteDC(hdcScr);   
  11. }   
  12.     
  13. // 初始化图像显示的对象   
  14. bool CPuzzleView::InitView(HWND hWnd)   
  15. {   
  16.        m_hWnd = hWnd; //将窗口句柄传进来   
  17.        m_hBmpBack = (HBITMAP)LoadImage(NULL, _T("res//background.bmp"), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);//读取图片文件  
  18.        if(m_hBmpBack == NULL)   
  19.        {   
  20.               MessageBox(NULL, _T("读取背景文件失败"), _T("Error"), MB_OK);   
  21.               return false;   
  22.        }   
  23.        DrawPic(m_hBmpBack, 0, 0, 800, 600);//画背景  
  24.        return true;   
  25. }   
  26.     
  27. // 用于重绘   
  28. void CPuzzleView::OnPaint(void)   
  29. {   
  30.        DrawPic(m_hBmpBack, 0, 0, 800, 600);//重绘背景  
  31. }   
 
在CPuzzleMain类里添加函数
Code:
  1. // 执行初始化工作   
  2. bool CPuzzleMain::InitMain(HWND hWnd)   
  3. {   
  4.        m_View.InitView(hWnd);   
  5.        return false;   
  6. }   
  7. // 用来重绘   
  8. void CPuzzleMain::OnPaint(void)   
  9. {   
  10.        m_View.OnPaint();   
  11. }   
  12.     
然后,在Puzzle.cpp中,也就是系统自动生成的文件里添加全局变量及头文件引用
#include "PuzzleMain.h"
CPuzzleMain g_PuzzleMain;//保存游戏实例
在下面的BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数中,return前加上游戏的初始化代码
g_PuzzleMain.InitMain(hWnd);
在消息循环的函数中,找到
Code:
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)   
  2. {   
  3. …   
  4. case WM_PAINT:   
  5.               hdc = BeginPaint(hWnd, &ps);   
  6.               // TODO: 在此添加任意绘图代码...   
  7.               g_PuzzleMain.OnPaint();//添加绘图代码  
  8.               EndPaint(hWnd, &ps);   
  9.               break;   
  10. …   
  11. }  
 
 
好了,现在编译并运行程序,就可以显示出来背景了。
简单介绍一下,在OnPaint()里会看到HDC类型的变量,比如
HDC hMem;这是声明了一个内存DC,所谓DC,网上说的是设备描述表(Device ContextDC),设备描述表(Device ContextDC)是一个信息结构体,包含物理输出设备及其驱动程序。在Windows平台下,所有的图形操作都是通过它完成。
不用管他是什么结构体,只要知道用它可以操作图形图像,想显示在显示器里就要创建一个兼容显示设备的DC,然后就可以显示了,比如
Code:
  1. HDC hdcMem;                                                                                    //内存DC  
  2.        HDC hdcScr = GetDC(m_hWnd);                             //获取屏幕的DC  
  3.        hdcMem = CreateCompatibleDC(hdcScr);    //创建兼容屏幕的内存DC  
  4.        SelectObject( hdcMem, hBitmap );                            //将图片绑定内存DC上  
  5.        BitBlt( hdcScr, x, y, nWidth, nHeight, hdcMem, srcX, srcY, SRCCOPY ); //将内存DC里的东西画到屏幕上  
 
这个过程是先创建内存DC,然后获取了屏幕DC,再设置内存DC兼容屏幕DC,其实就是这两个的信息是一致的了,然后把图片绑定到内存DC里,这样,内存DC里就有了图片,但是,这时还看不到图片,我们最后用BitBlt函数把内存DC里的东西复制到屏幕DC上,这样就能显示出来,我们就看到了。如果还是不明白的话,请上网百度,Google一下,有很多解释的。
Code:
  1. case WM_PAINT:   
  2.            hdc = BeginPaint(hWnd, &ps);   
  3.            // TODO: 在此添加任意绘图代码...  
  4.            g_PuzzleMain.OnPaint();//添加绘图代码  
  5.            EndPaint(hWnd, &ps);   
  6.            break;  
WM_PAINTwindows应用程序的重绘消息,当收到这个消息的时候,就意味着屏幕要发生变化了,需要重绘,一般的,当你把窗口移到屏幕外,再移回来,就要发生重绘等等,我们在这加上重绘代码,使我们的程序在移动或者被覆盖的时候还能显示回来。

未完待续……

其他文章链接:

[原创+连载]一步一步做拼图游戏,C++版(一): student.csdn.net/space.php

[原创+连载]一步一步做拼图游戏,C++版(三): student.csdn.net/space.php

当前文章代码链接:

download.csdn.net/source/2698448