第10章在MFC中创建应用程序的资源.ppt
《第10章在MFC中创建应用程序的资源.ppt》由会员分享,可在线阅读,更多相关《第10章在MFC中创建应用程序的资源.ppt(43页珍藏版)》请在三一文库上搜索。
1、1,第10章 在MFC中创建应用程序的资源,2,在Windows的可执行文件中,资源是独立于代码的,使用单独的Resource Compiler进行编译,并嵌入到可执行文件中。 在编程过程中,代码是可复用的,资源也是可复用的,通过资源的“导入”和“导出”功能来实现资源的可复用。 程序的国际化,也是通过资源来实现的。,3,10.1获取资源的一个样例,查看Windows(98/2000)系统中自带的纸牌游戏中的图片资源: c:Windowscards.dll 或 c:WINNTSystem32,4,10.2 资源的应用,5,10.2.1 菜单资源的使用,创建一个“计算”菜单,6,【例10-1】创建
2、一个基于单文档结构的应用程序,在视图中显示一行字符串“Hello World!”,通过建立包含“显示”和“颜色选择”两个菜单项的“操作”菜单来控制字符串,菜单项“显示”用以控制字符串的显示与否,菜单项“颜色选择”中包含一个级连菜单,内容为“红”、“绿”和“蓝”三个菜单项。,Hello World!,ID_OPER_RED ID_OPER_GREEN ID_OPER_BLUE,ID_OPER_SHOW,7,在My_ResView.h中的 class CMy_ResView : public Cview 中的public处加入如下声明: COLORREF m_nColors3; /用户可选颜色数组
3、 DWORD m_nColorIndex; / 当前所选颜色索引 CString m_strShow; / 显示的内容 BOOL m_bShow; / 是否显示,8,在CMy_ResView:CMy_ResView()中初始化成员变量: m_nColors0 = RGB(255,0,0); m_nColors1 = RGB(0,255,0); m_nColors2 = RGB(0,0,255); m_nColorIndex = 0; m_strShow = “Hello World!“; m_bShow = TRUE;,在void CMy_ResView:OnDraw(CDC* pDC) 中加
4、入如下代码绘制字符串: if(m_bShow) pDC-SetTextColor(m_nColorsm_nColorIndex); / 设置输出字符串颜色 pDC-TextOut(100,100,m_strShow); / 输出字符串 ,9,若编译运行程序,可看到程序输出一行红色的字符串,但颜色设置菜单项还没有起作用 下面将介绍如何通过菜单项来控制程序,在介绍菜单项的响应时,必须先了解几个消息响应机制: COMMAND消息的响应 UPDATE_COMMAND_UI消息的响应 ON_COMMAND_RANGE对COMMAND消息的响应 ON_UPDATE_COMMAND_UI_RANGE对UPD
5、ATE_COMMAND_UI消息的响应,10,(1) COMMAND消息的响应,添加了对COMMAND消息的响应之后, My_ResView.h发生如下变化: / Generated message map functions protected: /AFX_MSG(CMy_ResView) afx_msg void OnOperShow(); /AFX_MSG,11,在My_ResView.cpp文件中,读者会看到ID_OPER_SHOW对应的COMMAND消息的绑定,代码如下 : BEGIN_MESSAGE_MAP(CMy_ResView, CView) /AFX_MSG_MAP(CMy_
6、ResView) ON_COMMAND(ID_OPER_SHOW, OnOperShow) /AFX_MSG_MAP / Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview) END_MESSAGE_MAP() 在My_ResView.cpp文件的最后加入如下代码: void CMy_
7、ResView:OnOperShow() m_bShow = !m_bShow; Invalidate(); / 强制程序重新窗口 ,重新编译运行程序,可看到“显示”菜单项工作正常,12,(2) UPDATE_COMMAND_UI消息的响应,UPDATE_COMMAND_UI消息是在窗口将要绘制菜单项的时候产生,上例中,仅仅只是使用“显示”菜单项来控制是否显示似乎还不够,如果“显示”菜单项能够配合主程序体现出当前是否显示的状态可能会更好一些。就像一个文本编辑软件,菜单上是“10号字”、“12号字”的功能,如果不在菜单上标识出来,那么使用者可能就搞不清当前的字是多大的。 为ID_OPER_SHO
8、W添加UPDATE_COMMAND_UI消息。在自动生成消息处理函数中加入如下代码: void CMy_ResView:OnUpdateOperShow(CCmdUI* pCmdUI) pCmdUI-SetCheck(m_bShow); 此时可看到随着m_bShow的值的改变,显示菜单项的状态与实际是否显示字符串的状态一致了,通过菜单项前面的“”标记来体现。,13,void Enable( BOOL bOn = TRUE ) 禁止或者允许该菜单项 void SetCheck( int nCheck = 1 ) 设置菜单项/工具条按钮的check状态,显示标志为“” void SetRadio(
9、 BOOL bOn = TRUE ) 与SetCheck功能类似,显示标志为“” void SetText( LPCTSTR lpszText ) 设置菜单项的Caption属性,CCmdUI类常用的方法,14,(3) ON_COMMAND_RANGE对COMMAND消息的响应,ON_COMMAND_RANGE为处理具有连续Object ID的菜单项提供了方便的途径。 前面只响应了三种颜色操作,若有100种颜色可供选择,是否逐个定义其响应函数?显然工作量很大,我们可以使用ON_COMMAND_RANGE。 这涉及到ID范围的上下界及当前的ID,若Resource.h中若干个ID不连续,要手工修
10、改为连续的。 由于ClassWizard不支持ON_COMMAND_RANGE消息的自动映射,只能手工添加消息的处理。 在My_ResView.h中声明消息的处理函数 /AFX_MSG(CMy_ResView) afx_msg void OnOperShow(); afx_msg void OnUpdateOperShow(CCmdUI* pCmdUI); afx_msg void OnOperColorChange(WORD nID); /AFX_MSG,所处理的菜单项的ID。,15,在My_ResView.cpp的开头部分加入如下斜体标识的代码,完成消息映射 BEGIN_MESSAGE_M
11、AP(CMy_ResView, CView) / ON_COMMAND_RANGE( ID_OPER_RED, / ID范围的最小值 ID_OPER_BLUE, / ID范围的最大值 OnOperColorChange) /消息处理函数 END_MESSAGE_MAP() 在My_ResView.cpp的最后加入消息处理函数: void CMy_ResView:OnOperColorChange(WORD nID) m_nColorIndex = nID-ID_OPER_RED; Invalidate(); 运行程序,可以通过菜单项来改变颜色了,16,(4) ON_UPDATE_COMMAND
12、_UI_RANGE,ON_UPDATE_COMMAND_UI_RANGE与ON_UPDATE_COMMAND_UI的关系类似和ON_COMMAND_RANGE与ON_COMMAND的关系 下面仿照手工加入ON_COMMAND_RANGE过程加入ON_UPDATE_COMMAND_UI_RANGE宏。 在My_ResView.h中加入如下代码: afx_msg void OnUpdateOperColorChange(CCmdUI * pCmdUI);,17,在My_ResView.cpp中加入如下代码: ON_UPDATE_COMMAND_UI_RANGE(ID_OPER_RED,ID_OPE
13、R_BLUE,OnUpdateOperColorChange) void CMy_ResView:OnUpdateOperColorChange(CCmdUI * pCmdUI) pCmdUI-SetRadio(m_nColorIndex= (pCmdUI-m_nID - ID_OPER_RED); 由于CCmdUI类的成员m_nID就是调用OnUpdateOperColorChange时当前的菜单项ID,因此OnUpdateOperColorChange函数没有nID这个参数,18,10.2.2快捷菜单的创建及其应用,【例10-2】在【例10-1】的基础上增加快捷菜单,实现“操作”菜单的功能
14、,1. 创建菜单资源:在ResourceView菜单中右击Menu,选择Insert Menu,资源命名为IDR_MENU_POP,19,在My_ResView.h中声明快捷菜单中对应的变量。 CMenu m_PopMenu; / Pop-up快捷菜单 CMenu* m_pPop; / Pop-up快捷子菜单 afx_msg void OnRButtonDown(UINT nFlags, CPoint point); 在My_ResView.cpp中添加如下代码: ON_COMMAND(ID_POP_SHOW, OnOperShow) /消息响应 CMy_ResView:CMy_ResView
15、() m_PopMenu.LoadMenu(IDR_MENU_VIEW); / 创建并加载菜单资源 ,20,CMy_ResView:CMy_ResView() m_PopMenu.DestroyMenu(); / 释放菜单资源 void CMy_ResView:OnRButtonDown(UINT nFlags, CPoint point) m_pPop=m_PopMenu.GetSubMenu(0); /获得第一个子菜单 UINT nCheck = m_bShow?MF_CHECKED:MF_UNCHECKED; / 更新【Show】的check状态 m_pPop-CheckMenuItem
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 MFC 创建 应用程序 资源
链接地址:https://www.31doc.com/p-2576622.html