版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一章 MFC编程基础,复习 如何新建类 自定义MFC风格,1 MFC基础知识复习,新建工程 对话框,常用控件 SDI,添加菜单、工具栏、事件(消息)处理函数 GDI 绘制点,线,圆,矩形,文字 显示图片,拉伸/压缩图片 双缓冲显示 动画机制及其实现,示例:CatchMe,一个小猴子,随机出现在某个位置 在一个给定的时间内,玩家可以用鼠标左键来点击该猴子,若击中,则该小猴子立即“变脸” 在给定时间结束时,若玩家还没有击中,该小猴子就会逃走,随机出现在另外的位置 可以选择猴子数量和给定的时间(难度系数),1.1 分析仅一只猴子的情形,显示原始图片 判断鼠标是否点中图片 判断时间是否结束 若在给定
2、时间内点中图片,则在原位置更换图片 若在给定时间内没有点中图片,则继续以上过程,设计过程,导入两张图片 因为图片位置是随机产生的,并且会随着时间变化,因此要设置为变量x,y srand( (unsigned)time( NULL ) ); int x=rand(); 其中x的范围是0, RAND_MAX, RAND_MAX是32767 制作开始菜单和工具栏 添加鼠标事件和时钟事件 判断选中与否,1.2 多只猴子?,若程序中固定有N只猴子,则需声明数组或链表来: 分别记录每只猴子的位置 分别记录每只猴子的选中状态 若游戏难度级别可调,即猴子数量和时间间隔可预设,则需添加对话框来设置猴子数量,以及
3、时间间隔,如何给程序添加对话框,方法一: 选择菜单“Insert”“New Form”,在弹出的对话框中的“Base Class”中选择 CDialog 在“Name”中填写对话框类的类名字 这样,就生成了一个对话框类和相应的对话框资源 方法二: 选择菜单“Insert”“Resource“, 在弹出的对话框中,选择“Dialog” 方法二只生成了资源,而没有类文件,主程序与对话框的数据交换,在主程序的设置函数中,可以如下实现 CMyDialog dialog; If(dialog.doModal()=IDOK) numOfMonkey=dialog.m_nNum; 其中m_nNum是对话框类
4、的成员变量,numOfMonkey是主程序试图类中的成员变量,如何管理数量变化的数据对象,在猴子数量可以预设的游戏程序中,猴子数并不是预先知道的,那么如何来管理(记录、保存、遍历、增删等)猴子对象呢? 动态数组 链表,动态数组,动态数组,需在堆中重新开辟内存空间 一维数组的动态生成方法: int *m_bIsSelected=new intnumOfMonkey; 二维数组的动态生成方法: xy=new int* numOfMonkey; for (int i=0;inumOfMonkey;i+) xyi=new int2;,2 自定义类,MFC生成的应用程序框架,仅仅是一个框架而已,用户根据
5、自己的需要,可以在此框架的基础上,进一步扩展以具备更多功能 扩展应用程序的方法,就是添加类(class) 类,可以实现对“相对独立的那部分功能”进行封装,示例:对多猴程序的改进,在前面的多猴程序(示例2)中,是在视图类中声明了多个变量和相关函数,程序结构并不简洁 可以把猴图片的相关数据以及对猴图片的相关处理集中起来,在一个类中来实现 那么,这个类应包含哪些成员变量和成员函数? 位置,即左上角位置 大小,即图片长和宽 状态,即是否被选中 大小信息由外部输入,即需要设置函数 位置是变化的,即需要随机产生 还要判断某点是否位于图片之上的函数,添加新类,class CMonkey public: CM
6、onkey(); virtual CMonkey(); public: int x; int y; int w; int h; bool m_bIsSelcted; void setWidth(int width); void setHeight(int height); void setPosition(); bool IsPointIn(CPoint pt); ;,void CMonkey:setWidth(int width) w=width; void CMonkey:setHeight(int height) h=height; void CMonkey:setPosition()
7、x=rand()%600; y=rand()%500; bool CMonkey:IsPointIn(CPoint pt) CRect rect; rect.SetRect(x,y,x+w,y+h); if (rect.PtInRect(pt) return true; else return false; ,在主程序中使用新类,要在主程序中的某个文件中使用新类,只需在该文件中添加头文件声明即可,如 #include Monkey.h“,动态管理数据的另一种方法:链表,利用对话框得到猴子数目后,可以利用链表来管理动态生成的猴子对象,从而起到如同动态数组的功能 CList monkeyList;
8、 for (int i=0;isetWidth(width); m-setHeight(height); m-setPosition(); monkeyList.AddTail(m); ,视图类成员变量,class CCatchMonkeyView : public CView int numOfMonkeys; /猴子数量 CList monkeyList; int width; /猴图片宽和高 int height; int unSelectedNum; /记录还没有被选中的猴子数 ,给主程序添加菜单,添加“设置猴子数”和“游戏开始”的菜单命令项,给主程序添加消息响应函数,响应菜单消息 v
9、oid CCatchMonkeyView:OnSetMonkey() void CCatchMonkeyView:OnStartGame() 2. 响应鼠标事件和时钟事件 void CCatchMonkeyView:OnTimer(UINT nIDEvent) void CCatchMonkeyView:OnLButtonDown() ,添加设置猴子数量对话框,添加对话框及对话框类 设计对话框界面 添加对话框成员变量:m_num,建立对话框与主程序之间的联系,void CCatchMonkeyView:OnSetMonkey() CSetDlg dlg; if (dlg.DoModal()=I
10、DOK) numOfMonkeys=dlg.m_num; for (int i=0;isetWidth(width); m-setHeight(height); m-setPosition(); monkeyList.AddTail(m); unSelectedNum=numOfMonkeys; ,开始游戏,void CCatchMonkeyView:OnStartGame() SetTimer(1,1000,NULL); Invalidate(); ,显示程序,void CCatchMonkeyView:OnDraw(CDC* pDC) CBitmap bt1; bt1.LoadBitmap
11、(IDB_BITMAP1); . CDC dc; dc.CreateCompatibleDC(pDC); POSITION pos=monkeyList.GetHeadPosition(); while(pos) CMonkey* m=monkeyList.GetNext(pos); if (!m-m_bIsSelcted) dc.SelectObject(bt1); pDC-BitBlt(m-x,m-y,m-w,m-h, ,时钟消息处理,对于没有选中的猴子,每个一个间隔就改变位置 void CCatchMonkeyView:OnTimer(UINT nIDEvent) POSITION po
12、s=monkeyList.GetHeadPosition(); while(pos) CMonkey* m=monkeyList.GetNext(pos); if (!m-m_bIsSelcted) m-setPosition(); Invalidate(); CView:OnTimer(nIDEvent); ,左键按下事件消息,void CCatchMonkeyView:OnLButtonDown(UINT nFlags, CPoint point) POSITION pos=monkeyList.GetHeadPosition(); while(pos) CMonkey* m=monkey
13、List.GetNext(pos); if (!m-m_bIsSelcted ,配套代码说明,1. CatchOne:程序中仅有一个猴子时的代码 2. CatchMany:程序中猴子数量可以预设,并且采用动态生成数组方式 3. CatchMonkey:程序中猴子数量可以预设,利用链表的方法来实现动态生成对象,并生成CMonkey类,3 自定义MFC风格,游戏风格界面的定制 界面大小固定 预知窗口大小 全屏显示,3.1 游戏风格的界面,我们的通用MFC应用程序界面还不够“游戏化” 与左图的SDI界面相比,游戏界面没有工具栏,状态栏,有些甚至没有菜单栏,是把菜单直接列在界面中,工具栏/状态栏,工具
14、栏、状态栏都是框架的组成部分 它们资源是在CMainFrame:OnCreate函数中加载的,class CMainFrame : public CFrameWnd public: virtual CMainFrame(); protected: CStatusBar m_wndStatusBar; /状态栏 CToolBar m_wndToolBar; /工具栏 protected: afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct);,int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStru
15、ct) if (CFrameWnd:OnCreate(lpCreateStruct) = -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFRAME) return -1; if (!m_wndStatusBar.Create(this) | !m_wndSt
16、atusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT) return -1; m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar( ,如何去掉工具栏菜单栏,如果不想要工具栏或状态栏,直接在CMainFrame中的OnCreate()函数中将工具栏(m_wndToolBar)和状态栏(m_wndStatusBar)的相关代码去掉,去掉菜单,一般说来,大多VC编写的游戏是有菜单的。若你功能比较简单
17、,菜单都不想用,可以如下操作: 我们在OnCreate函数中添加 SetMenu(NULL); 就得到没有菜单的应用程序 BOOL SetMenu( CMenu* pMenu ); 若pMenu 为NULL,则当前菜单被移去,去掉标题栏,你还不满足,希望界面更干净,欲去标题栏而后快,可以如下操作: 在OnCreate函数中添加: ModifyStyle(WS_CAPTION, 0); virtual BOOL ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags ); dwRemove:欲删除的样式 dwAdd:欲添加的样式 nFlags:
18、Window positioning flags,即修改前与修改后窗口的位置大小关系,可以不用.,Windows Styles,WS_BORDERCreates a window that has a border. WS_CAPTIONCreates a window that has a title bar (implies the WS_BORDER style). Cannot be used with the WS_DLGFRAME style. WS_DLGFRAMECreates a window with a double border but no title. WS_HSC
19、ROLLCreates a window that has a horizontal scroll bar. WS_ICONICCreates a window that is initially minimized. Same as the WS_MINIMIZE style. WS_MAXIMIZECreates a window of maximum size. WS_MAXIMIZEBOXCreates a window that has a Maximize button. WS_MINIMIZECreates a window that is initially minimized
20、. For use with the WS_OVERLAPPED style only.,WS_MINIMIZEBOXCreates a window that has a Minimize button. WS_OVERLAPPEDCreates an overlapped window. An overlapped window usually has a caption and a border. WS_OVERLAPPEDWINDOWCreates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,
21、WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. WS_SIZEBOXCreates a window that has a sizing border. Same as the WS_THICKFRAME style. WS_SYSMENUCreates a window that has a Control-menu box in its title bar. Used only for windows with title bars. WS_THICKFRAMECreates a window with a thick f
22、rame that can be used to size the window. WS_VISIBLECreates a window that is initially visible. WS_VSCROLLCreates a window that has a vertical scroll bar.,3.2 大小固定的界面,目前生成的应用程序的界面,用户可以拖动边框来更改界面大小。对于游戏和某些应用程序,其界面大小要求是固定的 让界面大小固定的方法可能很多,这里介绍两种方法 一种是利用ModifyStyle()函数来实现 另一种是在CMainFrame:PreCreateWindow(
23、)函数中实现,ModifyStyle()实现,在Windows Style中,WS_THICKFRAME 样式可以使得窗口能被改变大小 我们可以在OnCreate函数中添加: ModifyStyle(WS_THICKFRAME, 0); 我们再试试看,窗口大小能否被改变? 既然窗口大小不能再改变,那么窗口右上角的最大最小按钮也就没有必要存在,按照同样的方法,将他们去掉: ModifyStyle(WS_MAXIMIZEBOX,0); ModifyStyle(WS_MINIMIZEBOX,0);,PreCreateWindow()中实现,PreCreateWindow()函数是为创建窗口前初始化工作提供的接口 virtual BOOL PreCreateWindow( CREATESTRUCT,我们在PreCreateWindow()函数中添加: cs.st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- FSC车队介绍课件
- 鲁教版七年级生物期末模拟试卷及答案
- 2027年备考VIP押题班.初级实务高分通关题库可打印版
- 浙教版九年级数学期中复习试卷及答案
- 圆创高三语文试题及答案
- 鲁教版二年级科学上册期末试卷及答案
- 缝纫工培训课件
- 反欺诈项目介绍课件
- 2026年前台接待员岗位考核试题库
- 2026年机关公务用车安全员题库含答案
- 中级经济师知识产权专业知识与实务真题及解析(2026年)
- 冬季施工安全管理与防护措施培训
- AQ3072-2026《危险化学品重大危险源安全包保责任管理要求》解读
- 跨学科视域下的问题解决:解直角三角形在坡比、坡度问题中的应用教学设计
- 2025学年保定市十校高二语文上学期期中联考试卷附答案解析
- 2024-2025学年广东省广州市天河区八年级上学期期中数学试卷(含答案)
- 2024年宁波镇海区蛟川街道办事处招聘真题
- 远景能源面试题目及答案
- GJB3206B-2022技术状态管理
- 2025年四川省行政执法资格考试题库及答案
- 养老院短住协议书(2篇)
评论
0/150
提交评论