[原创+连载]一步一步做拼图游戏,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)添加以下几个函数
- // 画图,hBitmap表示指向图片的指针,x,y表示位图显示的横纵坐标,nWidth,nHeight位图的宽度和高度,srcX,srcY从位图的的哪个位置开始显示
- void CPuzzleView::DrawPic(HBITMAP hBitmap, int x, int y, int nWidth, int nHeight, const int srcX=0, const int srcY=0)
- {
- HDC hdcMem; //内存DC
- HDC hdcScr = GetDC(m_hWnd); //获取屏幕的DC
- hdcMem = CreateCompatibleDC(hdcScr); //创建兼容屏幕的内存DC
- SelectObject( hdcMem, hBitmap ); //将图片绑定内存DC上
- BitBlt( hdcScr, x, y, nWidth, nHeight, hdcMem, srcX, srcY, SRCCOPY ); //将内存DC里的东西画到屏幕上
- DeleteDC(hdcMem); //清除两个DC
- DeleteDC(hdcScr);
- }
- // 初始化图像显示的对象
- bool CPuzzleView::InitView(HWND hWnd)
- {
- m_hWnd = hWnd; //将窗口句柄传进来
- m_hBmpBack = (HBITMAP)LoadImage(NULL, _T("res//background.bmp"), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);//读取图片文件
- if(m_hBmpBack == NULL)
- {
- MessageBox(NULL, _T("读取背景文件失败"), _T("Error"), MB_OK);
- return false;
- }
- DrawPic(m_hBmpBack, 0, 0, 800, 600);//画背景
- return true;
- }
- // 用于重绘
- void CPuzzleView::OnPaint(void)
- {
- DrawPic(m_hBmpBack, 0, 0, 800, 600);//重绘背景
- }
在CPuzzleMain类里添加函数
- // 执行初始化工作
- bool CPuzzleMain::InitMain(HWND hWnd)
- {
- m_View.InitView(hWnd);
- return false;
- }
- // 用来重绘
- void CPuzzleMain::OnPaint(void)
- {
- m_View.OnPaint();
- }
然后,在Puzzle.cpp中,也就是系统自动生成的文件里添加全局变量及头文件引用
#include "PuzzleMain.h"
CPuzzleMain g_PuzzleMain;//保存游戏实例
在下面的BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数中,return前加上游戏的初始化代码
g_PuzzleMain.InitMain(hWnd);
在消息循环的函数中,找到
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- …
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- g_PuzzleMain.OnPaint();//添加绘图代码
- EndPaint(hWnd, &ps);
- break;
- …
- }
好了,现在编译并运行程序,就可以显示出来背景了。
简单介绍一下,在OnPaint()里会看到HDC类型的变量,比如
HDC hMem;这是声明了一个内存DC,所谓DC,网上说的是设备描述表(Device Context,DC),设备描述表(Device Context,DC)是一个信息结构体,包含物理输出设备及其驱动程序。在Windows平台下,所有的图形操作都是通过它完成。
不用管他是什么结构体,只要知道用它可以操作图形图像,想显示在显示器里就要创建一个兼容显示设备的DC,然后就可以显示了,比如
- HDC hdcMem; //内存DC
- HDC hdcScr = GetDC(m_hWnd); //获取屏幕的DC
- hdcMem = CreateCompatibleDC(hdcScr); //创建兼容屏幕的内存DC
- SelectObject( hdcMem, hBitmap ); //将图片绑定内存DC上
- BitBlt( hdcScr, x, y, nWidth, nHeight, hdcMem, srcX, srcY, SRCCOPY ); //将内存DC里的东西画到屏幕上
这个过程是先创建内存DC,然后获取了屏幕DC,再设置内存DC兼容屏幕DC,其实就是这两个的信息是一致的了,然后把图片绑定到内存DC里,这样,内存DC里就有了图片,但是,这时还看不到图片,我们最后用BitBlt函数把内存DC里的东西复制到屏幕DC上,这样就能显示出来,我们就看到了。如果还是不明白的话,请上网百度,Google一下,有很多解释的。
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- g_PuzzleMain.OnPaint();//添加绘图代码
- EndPaint(hWnd, &ps);
- break;
未完待续……
其他文章链接:
[原创+连载]一步一步做拼图游戏,C++版(一): student.csdn.net/space.php
[原创+连载]一步一步做拼图游戏,C++版(三): student.csdn.net/space.php
当前文章代码链接:
download.csdn.net/source/2698448
- [原创+连载]一步一步做拼图游戏,C++版(二)
- [原创+连载]一步一步做拼图游戏,C++版(一)
- [原创+连载]一步一步做拼图游戏,C++版(三)
- [原创+连载]一步一步做拼图游戏,C++版(四)
- [原创+连载]一步一步做拼图游戏,C++版(五)
- [原创+连载]一步一步做拼图游戏,C++版(六)
- [原创+连载]一步一步做拼图游戏,C++版(七)
- (连载)一步一步教你做黑白棋游戏(二)
- (连载)一步一步教你做黑白棋游戏(一)
- (连载)一步一步教你做黑白棋游戏(三)
- (连载)一步一步教你做黑白棋游戏(四)
- (连载)一步一步教你做黑白棋游戏(五)
- 一步一步教你做LIS接口教程(二)
- 一步一步做一个linux文件传输软件(二)---->>>废话篇
- 原创JS拼图游戏
- 零打碎敲学Android(二)—做个拼图游戏吧
- 零打碎敲学Android(二)—做个拼图游戏吧
- 项目:拼图游戏(二)逆序数计算
- 1010(stamps),acm.pku.edu.cn
- 000
- 视频学习还真不赖!!
- HourMenuExtender控件
- 和大家分享一个用来做图表的好控件
- [原创+连载]一步一步做拼图游戏,C++版(二)
- js验证手机号码(最新)
- going away
- 电脑比较卡(内存太小)
- PHP学习
- PD导入SQL技巧
- 毕业了、面试ing....
- 新来的
- 学习strust感想