第10章在MFC中创建应 用程序的资源
1 第10章 在MFC中创建应 用程序的资源
在 Windows的可执行文件中,资源是 独立于代码的,使用单独的 Resource Compiler进行编译,并嵌入到可执行文 件中。 在编程过程中,代码是可复用的,资 源也是可复用的,通过资源的“导入” 和“导出”功能来实现资源的可复用。 程序的国际化,也是通过资源来实现 的
2 在Windows的可执行文件中,资源是 独立于代码的,使用单独的Resource Compiler进行编译,并嵌入到可执行文 件中。 在编程过程中,代码是可复用的,资 源也是可复用的,通过资源的“导入” 和“导出”功能来实现资源的可复用。 程序的国际化,也是通过资源来实现 的
10.1获取资源的一个样例 查看 Windows(98/2000系统中自带的纸 牌游戏中的图片资源: c: Windowslcards dll E c: WINNTISystem32 J开 2x园 cards dll 查找范围①:st2 會 cards. d l‖l a cabinet. dIl scats.dll a] ddfviewdIl .]coral. dll 中Bmap s] labviewdll B]catsrvps dll scdmdl e]crtc. dll -CACLS.EXE S]catsryut dll a modem. dll s]certadmdll t1 English (U.S. J) fm calc. exe S]CBA.DLL cdonts.dll 1 10(English(U.s J) s] capesnpn dll s] ccfapi 32 dll cdosys a certer. dIl ③ cdplayer, exe S]CEWMDM 剑[ English (U.S. J tg 12 [ English (U. s JI 文件名①) ds. dll 打开 t 13 English (U.s. 1 文件类型〔r):| Executable Files(exe;:dn1:ocx) 取消 414 (English(U.s. I 厂以只读方式打开①R 4g 15 English (U.s. J) Open as:Resources 6g16 (English (U.. I
3 10.1获取资源的一个样例 查看Windows(98/2000)系统中自带的纸 牌游戏中的图片资源: c:\Windows\cards.dll 或 c:\WINNT\System32
102资源的应用
4 10.2 资源的应用
1021菜单资源的使用 a File Edit View Insert Project Build Tools Window Help -ax 1y Res. rc-IDR MAINFRAME(Menu) 文件(编辑(E查看(y帮助计算[≌ Menu Item Properties 创建 -a 2 General Extended Styles 个“计 Caption 算 厂 Separator Pop-up Inactive Bre Checked Grayed Help Prompt:
5 10.2.1 菜单资源的使用 创建一 个“计 算”菜 单
例10-1】创建一个基于单文档结构的应用程 序,在视图中显示一行字符串“ Hello World!”,通过建立包含“显示”和“颜色选 择”两个菜单项的“操作”菜单来控制字符 串,菜单项“显示”用以控制字符串的显示 与否,菜单项“颜色选择”中包含一个级连 菜单,内容为“红”、“绿”和“蓝”三个 E- Res. rc-IDR MAINFRAME(Menu) ID OPER SHOW 文件()查看操作[Q]帮助出 显示+W ID OPER RED 颜色选择 红色[B] 绿色[G ID OPER GREEN 蓝色[日] ID OPER BLUE Hello world!
6 【例10-1】创建一个基于单文档结构的应用程 序,在视图中显示一行字符串“Hello World!”,通过建立包含“显示”和“颜色选 择”两个菜单项的“操作”菜单来控制字符 串,菜单项“显示”用以控制字符串的显示 与否,菜单项“颜色选择”中包含一个级连 菜单,内容为“红” 、 “绿”和“蓝”三个 菜单项。 Hello World! ID_OPER_RED ID_OPER_GREEN ID_OPER_BLUE ID_OPER_SHOW
在 My_Res view. h中的 class CMy_Res view: public Cview 中的 public处加入如下声明: COLORREF m colors(3];O户可选颜色数组 DWORD m cOloriNdex;∥当前所选颜色索引 CString m_-strShow;∥显示的内容 BOoL m show;∥是否显示
7 在My_ResView.h中的 class CMy_ResView : public Cview 中的public处加入如下声明: COLORREF m_nColors[3]; //用户可选颜色数组 DWORD m_nColorIndex; // 当前所选颜色索引 CString m_strShow; // 显示的内容 BOOL m_bShow; // 是否显示
在CMy_ Res view: CMy_Review0中初始化成员变量: m_cOlors[0=RGB(255,0, 0) m_cOlors[1/=RGB(0, 255,0) m_cOlors(2] = RGB(0, 0, 255); m cOloriNdex=0 m str Show = "Hello world! m shoW= TRUE AEvoid CMy_ Resview: On Draw(CDC* pDC) 中加入如下代码绘制字符串: if(m_ show) i pDC-> Set TextColor(m_cOlors[m_n ColorIndex ∥设置物出字符牛颜色 pDC>7 extort(100100 m str Show;∥输出字符中
8 在CMy_ResView::CMy_ResView()中初始化成员变量: m_nColors[0] = RGB(255,0,0); m_nColors[1] = RGB(0,255,0); m_nColors[2] = RGB(0,0,255); m_nColorIndex = 0; m_strShow = "Hello World!"; m_bShow = TRUE; 在void CMy_ResView::OnDraw(CDC* pDC) 中加入如下代码绘制字符串: if(m_bShow) { pDC->SetTextColor(m_nColors[m_nColorIndex]); // 设置输出字符串颜色 pDC->TextOut(100,100,m_strShow); // 输出字符串 }
若编译运行程序,可看到程序输出一行红色 的字符串,但颜色设置菜单项还没有起作用 下面将介绍如何通过菜单项来控制程序, 在介绍菜单项的响应时,必须先了解几个消 息响应机制: COMMAND消息的响应 UP DATE COMMAND U消息的响应 ON COMMAND RANGE对 COMMAND消息的响应 ON UPDATE COMMAND UI RANGE X UPDATE COMMAND UI 消息的响应
9 若编译运行程序,可看到程序输出一行红色 的字符串,但颜色设置菜单项还没有起作用 下面将介绍如何通过菜单项来控制程序, 在介绍菜单项的响应时,必须先了解几个消 息响应机制: • COMMAND消息的响应 • UPDATE_COMMAND_UI消息的响应 • ON_COMMAND_RANGE对COMMAND消息的响应 • ON_UPDATE_COMMAND_UI_RANGE 对 UPDATE_COMMAND_UI 消息的响应
(1) COMMAND消息的响应 添加了对 COMMAND消息的响应之后, My_Review. h发 生如下变化: ll Generated message map functions protected IKIAFX MSG(CMy_Res view) afx_ msg void OnOper Show(; JAFX MSG Message Maps Member Variables Automation I ActiveX Events Class Info I Class name Add class D: .. My Res\My Resviewh, D: \. My Res\My Resviewcpp Object ID Messages: Delete Function PER GREEN Edit Code ID VIEW STATUS BAR ID VIEW TOOLBAR Member functions: V OnEgin Printing V OnDraw ON ID OPER SHOW: COMMAND V On PreparePrinting Description: Handle a command (from menu, accel, cmd button)
10 (1) COMMAND消息的响应 添加了对COMMAND消息的响应之后, My_ResView.h发 生如下变化: // Generated message map functions protected: //{{AFX_MSG(CMy_ResView) afx_msg void OnOperShow(); //}}AFX_MSG