[原创+连载]一步一步做拼图游戏,C++版(七)
来源:互联网 发布:在线网络教学 编辑:程序博客网 时间:2024/04/28 01:00
这次我们要使游戏更具有游戏性。我们要添加一个菜单。
添加菜单
1. 我们要在解决方案管理器中切换到资源视图,然后按下图:
双击Menu里的东西,然后在右边的“请在此键入”里写上想要的东西,然后在属性里改ID。
如果没有Menu,就在Puzzle.rc上单击右键,然后“添加资源”,然后选上”Menu”,再点“新建”就有了,然后自己加上各种信息,包括“文件”那些也要自己写了。
2. 改一下Resouce.h文件里的东西,如下图:
先说怎么改,双击打开Resource.h文件,会提示已经打开,是否关闭,点是,如果不可以的话,就把所有打开的资源关闭了再试。然后找到你前面定义的各种菜单ID,看看后面的数字是不是连续的,如果不是,请修改成连续的,但是一定不要和其他的重复了。所以,平时这个文件是不要随便动的。因为我们的程序小,用的资源少才可以这样干的。
再说说原因吧,这个文件从名字上看就是资源文件,我们的资源ID其实就是一个数字,都是宏定义的,写成ID是为了方便使用,所以我们在程序代码里用ID和用数字是一样的效果。改成连续的,我们在后面代码里用的时候就可以用循环了,而不需要每个都写一遍。
写完这个一定要记得把这个文件关了,否则就打不开资源文件了。
设置完以上的这些,代码就比较简单了。我们只是设置一下不同难度下,我们一共有的格子数就OK了。
还记得我们之前的做法,可以让我们设置任意数量的开始局面吗?现在用上了吧。在CPuzzleMain类里添加以下一个函数:
- void CPuzzleMain::Menu(int MenuID, HWND hWnd)
- {
- for(int i=0; i<6; i++)
- {
- CheckMenuItem(GetMenu(hWnd), IDM_BEGINER-i, MF_UNCHECKED);//设置为不选中
- }
- CheckMenuItem(GetMenu(hWnd), MenuID, MF_CHECKED);
- int BlockNum = 9-(MenuID-IDM_EXPERT)-1;//设置有多少块,因为我这里是专家级的最小,根据实际情况来。
- m_Logic.InitLogic(BlockNum);
- m_View.InitView(hWnd, BlockNum);
- m_View.LoadBMPList(m_Logic.GetBlock());
- m_View.SetGameStarted(true);
- m_Logic.SetGamePlaying(true);
- }
参数一个是菜单的ID,就是我们之前设置的那些,在资源管理器里设置的。第二个是应用程序句柄。
- for(int i=0; i<6; i++)
- {
- CheckMenuItem(GetMenu(hWnd), IDM_BEGINER-i, MF_UNCHECKED);//设置为不选中
- }
这里,就用到了我们之前的ID的数字是连续的,所以循环就可以实现了,否则就一个一个写,我这里就要写6个。
CheckMenuItem函数有三个参数,第一个是菜单的句柄,用GetMenu()获取到的。第二个是要修改的菜单项的ID。第三个是怎么处理,我这里是不选中。
再然后是根据等级来设置所分的块数。
CheckMenuItem(GetMenu(hWnd), MenuID, MF_CHECKED);
int BlockNum = 9-(MenuID-IDM_EXPERT)-1;//设置有多少块,因为我这里是专家级的最小,根据实际情况来。
一共6个等级,最低的是3*3的,最高的是8*8的。所以用上面的减法就可以算出是多少块。
再往下就是初始化的部分了,和以前的一样,就不多说了,多亏了以前留下的好方法,可以随便改。
现在我们有了菜单要做的事情,但是怎么触发呢?呵呵,这就是Windows的消息机制了。
打开Puzzle.cpp就是系统自动生成的那个,有main的那个。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
这个函数是消息处理函数,我们所有的消息都在这里,我们重点看以下的部分:
- switch (message)
- {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- case IDM_BEGINER:
- case IDM_PRIMER:
- case IDM_THRESHOLD:
- case IDM_MIDDLE:
- case IDM_HIGH:
- case IDM_EXPERT:
- g_PuzzleMain.Menu(wmId, hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- ……
当然我们省略了很多,这里有两个swtich,第一个switch是消息的类别,case WM_COMMAND:指的就是菜单消息,也就是说单击的是菜单的某项时,就触发这个消息。
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
我们要写的是后面的部分。
- case IDM_BEGINER:
- case IDM_PRIMER:
- case IDM_THRESHOLD:
- case IDM_MIDDLE:
- case IDM_HIGH:
- case IDM_EXPERT:
- g_PuzzleMain.Menu(wmId, hWnd);
- break;
这样的话,我们又多了难度选择,不过,开始的时候,菜单里没有一个打钩的,这怎么能行?所以在CPuzzleMain类里的Init函数里添加一句CheckMenuItem(GetMenu(hWnd), IDM_BEGINER, MF_CHECKED);//设置为选中菜鸟,这样开始的时候就有选择上菜鸟级了。
赶快试试吧。
代码下载:download.csdn.net/source/2978264
- [原创+连载]一步一步做拼图游戏,C++版(七)
- [原创+连载]一步一步做拼图游戏,C++版(一)
- [原创+连载]一步一步做拼图游戏,C++版(二)
- [原创+连载]一步一步做拼图游戏,C++版(三)
- [原创+连载]一步一步做拼图游戏,C++版(四)
- [原创+连载]一步一步做拼图游戏,C++版(五)
- [原创+连载]一步一步做拼图游戏,C++版(六)
- (连载)一步一步教你做黑白棋游戏(一)
- (连载)一步一步教你做黑白棋游戏(二)
- (连载)一步一步教你做黑白棋游戏(三)
- (连载)一步一步教你做黑白棋游戏(四)
- (连载)一步一步教你做黑白棋游戏(五)
- 天凉好个秋(连载七)
- 原创JS拼图游戏
- 一步一步学习hadoop(七)
- 一步一步学Vue(七)
- 《 Linux C编程一站式学习》连载七
- 配套自测连载(七)
- 一个Java程序员应掌握的10项技能(转载)
- 学习笔记
- C#虚方法virtual详解
- 麻烦啊
- 加油
- [原创+连载]一步一步做拼图游戏,C++版(七)
- 关于excel导入sql2005里面的问题
- 初来乍到
- UML类图
- 【转】VC2008 配置OpenGL环境
- SQL 2005(一)
- 计算机专业的大学生的警告
- 谁能帮忙指点迷津!
- study