扫雷游戏(定时器+GDI+数字时钟)学习收获

来源:互联网 发布:软件退税计算方法 编辑:程序博客网 时间:2024/06/04 01:09

本章设计的技术点如下:

定时器技术实现计时功能

注册表实现英雄榜记录的功能

GDI技术实现雷区的绘制功能

 

双缓冲技术感悟:

  1CPainDC dcthis)    获取当前设备

  2CDC dcMemory 定义一个内存设备

  3dcMemory.CreateCompatibleDC(&dc) 创建一个与当前设备兼容的位图

  4dc.BitBlt(... , &deMemory , ...) 将内存设备上的内容复制到当前设备上

 

总的来说,就是 不要有什么要贴的图片就往当前设备上贴,先全部往内存设备上贴,然后再一起往 当前设备上贴,

这样就可以防止双缓冲了

 

 

<span style="font-size:14px;">void CMineGameDlg::SetCheckedLevel(){<span></span>if (m_pSubMenu)<span></span>{<span></span>m_pSubMenu->CheckMenuItem(IDM_PRIMARY, MF_UNCHECKED | MF_BYCOMMAND);<span></span>m_pSubMenu->CheckMenuItem(IDM_SECOND, MF_UNCHECKED | MF_BYCOMMAND);<span></span>m_pSubMenu->CheckMenuItem(IDM_ADVANCE, MF_UNCHECKED | MF_BYCOMMAND);<span></span>m_pSubMenu->CheckMenuItem(IDM_CUSTOM, MF_UNCHECKED | MF_BYCOMMAND);<span></span>switch(m_uLevel)<span></span>{<span></span>case LEVEL_PRIMARY:<span></span>m_pSubMenu->CheckMenuItem(IDM_PRIMARY, MF_CHECKED | MF_BYCOMMAND);<span></span>break;<span></span>case LEVEL_SECONDRY:<span></span>m_pSubMenu->CheckMenuItem(IDM_SECOND, MF_CHECKED | MF_BYCOMMAND);<span></span>break;<span></span>case LEVEL_ADVANCE:<span></span>m_pSubMenu->CheckMenuItem(IDM_ADVANCE, MF_CHECKED | MF_BYCOMMAND);<span></span>break;<span></span>case LEVEL_CUSTOM:<span></span>m_pSubMenu->CheckMenuItem(IDM_CUSTOM, MF_CHECKED | MF_BYCOMMAND);<span></span>break;<span></span>default: <span></span>break;<span></span>}<span></span>}} </span>


总结:这段函数的功能就是菜单栏中的选钩 的功能,标记某项正在被使用中。

 

mfc中怎样在一个基于对话框程序中添加菜单栏?

 

1.新建一个菜单资源,命名ID为IDM_USER 

2.打开对话框资源,然后右键->属性->常规 里面有个"菜单" 下拉框,然后选择IDM_USER! 

3.编译连接即可;IDM_USER菜单资源,就加入到对话框上面了


 

<span style="font-size:14px;">void CMineGame_CopyDlg::DrawStartButton(CPaintDC &dc){<span></span>CDC cdc;<span></span>cdc.CreateCompatibleDC(&dc);<span></span>cdc.SelectObject(m_bmpFace); // 把位图资源加载进来<span></span>dc.StretchBlt(m_uBtnRect[0], 16, 24, 24, &cdc, 0, 24 * m_uBtnState, 24, 24, SRCCOPY);    <span></span>//  这个特别重要,,”24 * m_uBtnState ” 看似选择不同的位图,其实就只有一个长的位图,根据每个表情的宽度相同,高度也相同,根据表情的不同状态,选择<span></span><span></span>不同的高度,也就选择了不同的表情<span></span>dc.Draw3dRect(m_uBtnRect[1], 15, 26, 26, m_clrDark, m_clrDark);}</span>


总结:这种方法很不错,根据每个变量的状态,选择相应的位图,而且位图就只有一张只不过这种大小一样的东西,要怎么画呢??用什么软件画呢??

 

杂收获:

为了防止用户定义的消息ID与系统的消息ID冲突,MSMicrosoft)定义了一个宏WM_USER,小于WM_USERID被系统使用,大于WM_USERID被用户使用

 

总结:

这个扫雷游戏确实给了我很多丰富的学习,特别是作者的编程思想,清晰,有条理,似乎这一切的过程都在他的计划中,一步一个步骤来。具体收获如下:

1、知道了GDI技术的大概使用方法,说白了,一切可见之物都是使用GDI技术画出来的。无论是主游戏区还是辅助区,都是一笔一画,画出来的,而GDI技术不过那几个函数,但是如何灵活使用它们,确是需要智慧

2、表情,时钟技术,雷数目的绘画,这个实在太妙了,它是通过一长串的Bitmap,其实就一张图,然后根据需要选择相应的一部分,使用到的函数是 stretchBlt();

3、注册表技术,它相当于一个小的数据库,可以存排名版的数据,其中的函数不外乎那几个,创建,打开,查询,写入,退出

现在知道了有这么一个东西,以后需要就用它

4、具体的实现技术,通过左键按下,抬起,右键按下,抬起,作者自家还添加了左右键同时按下和抬起,很不错的想法,得学学。

5、在编程中,有点妙的地方是它的结构体,每个雷区都包含了它的众多属性,而作者本人却把这些属性都放在结构体里,实在值得学习。


额外收获:

在学习过程中,遇到困难不要轻易放弃,也不要急着完成任务,要正在融入到作者的程序代码里,享受获得知识的整个过程,知识不应该只是知识,而是要用情感去体会它,这样才不会觉得枯燥,而且有往下继续学的渴慕与动力,加油!!!


0 0