第四章 MFC资源统管理Word下载.docx
《第四章 MFC资源统管理Word下载.docx》由会员分享,可在线阅读,更多相关《第四章 MFC资源统管理Word下载.docx(50页珍藏版)》请在冰豆网上搜索。
位图资源
菜单项命令控制
IDM_
ID_
菜单项
命令项
控件
字符串
IDS_
IDP_
字符串表中的字符串
消息框中使用的字符串
资源符号的取值有一定的限制。
资源(加速键、位图、光标、对话框、图标、菜单、串表、工具栏和版本信息)的符号值范围为十进制的0~32767,而资源控件(如对话框控件或串表中的串)的符号值范围为0~65535或0~32767。
4.1.2资源编辑器
DevelopStudio提供了功能强大、易于使用的资源编辑器,用于创建和修改应用程序的资源。
使用资源编辑器,可以创建新的资源,修改、拷贝已有的资源,删除不再需要的资源。
例如可以用加速键编辑器处理加速键表,用图形编辑器处理图形资源(工具栏、位图、光标和图标等),用对话编辑器处理对话框,用菜单编辑器处理菜单等等。
创建或打开资源时,系统将自动打开相应的编辑器。
1创建资源
如果要创建新的资源,选择Insert->
Resourcre菜单命令,弹出InsertResourse对话框,如图4-2所示。
ResourseType列表选择资源类型,然后单击“New”按钮。
新创建的资源将加入到当前资源(.rc)文件中,相应的资源编辑器也会打开。
例如插入一个新的Menu,菜单编辑器就会打开。
图4-2InsertResourse对话框
2编辑资源
VC++提供了可视化工具资源编辑器编辑资源,资源编辑器有很多公共操作。
例如,你一旦学会了如何创建和打开一个对话框资源,你就能使用同样的步骤去创建和打开其它的资源。
使用资源编辑器能够
(1)查看资源
(2)使用资源模板
(3)导入和导出资源
(4)查看和编辑属性页
DeveloperStudio使用项目工作区的ResouceView面板统一组织和管理来查看资源,如图4-3所示。
首次打开ResourceView面板时,系统自动压缩每个资源分类,可单击“+”标记来扩展每一分类。
图4-3项目工作区窗口的ResourceView面板
资源编辑器主要包括:
(1)对话框编辑器(DialogEditor)
(2)菜单编辑器(MenuEditor)
(3)加速键编辑器(AcceleratorEditor)
(4)工具栏编辑器(ToolbarEditor)
(5)版本信息编辑器(VersionInformationEditor)
(6)字符串编辑器(StringEditor)
(7)图形编辑器(GraphicsEditor)
下面对每一类编辑器的使用作简要介绍:
(1)对话框编辑器
使用对话框编辑器可以创建或编辑一个对话框模板或者对话框资源,如图4-4所示。
常用操作包括:
1增加、删除和编辑控件
2改变Tab顺序
3布置控件位置
4测试一个对话框窗口
图4-4对话框编辑器
(2)菜单编辑器
使用菜单可以在一个工程项目中直观,有组织地安排命令。
菜单编辑器提供了创建和编辑窗口菜单的图形界面,使用菜单编辑器,可以创建标准菜单和菜单选项,为菜单或菜单选项定义热键、加速键和状态栏提示。
也可以创建快捷菜单,以便用鼠标右按钮来执行要频繁使用的命令。
建立菜单或菜单项后,可以用ClassWizard为菜单项映射函数并编写要执行的代码。
图4-5菜单编辑器
如图4-5所示。
双击任意一个菜单项,可以打开一个菜单项属性对话框,常用操作包括:
2创建标准菜单和命令
3创建弹出菜单命令
4设置快捷键、加速键和菜单命令项的状态栏消息
5移动菜单命令
(3)加速键编辑器
加速键表列出了窗口资源中加速键和相应的命令ID。
通常,加速键所对应的命令,都对应着一个菜单命令。
使用加速键编辑器可以维护加速键列表,如图4-6所示,常用操作包括:
1增加、删除、改变和浏览加速键列表
2浏览并改变加速键表资源ID
3将一个加速键与一个菜单命令相联系
图4-6加速键编辑器
(4)工具栏编辑器
工具栏编辑器可以帮助你创建工具栏资源,也可将位图转化为工具栏资源。
工具栏编辑器的使用上很类似于画图工具,如图4-7所示,常用操作包括:
1创建工具栏和按钮
2将位图转化为工具栏资源
3创建、移动、和编辑工具栏按钮
图4-7工具栏编辑器
对工具按钮的设置由两部分构成:
一是使用图形工具栏编辑位图;
二是在工具按钮属性对话框中输入工具按钮的ID。
一般工具按钮的ID是一个已定义的菜单项的ID,也可以定义一个新的ID,但要对这个新定义的ID定义消息处理函数。
添加一个工具按钮,只需对最后一个空白按钮做以上两部分操作,再将按钮拖到合适的位置。
删除一个工具按钮,只需使用鼠标将按钮拖出工具栏,抛弃即可。
通过鼠标的拖动操作,可以方便调整按钮在工具栏上的位置。
(5)版本编辑器
版本信息包括公司和产品的信息、语言、序列号、版权和商标的声明,版本信息编辑器帮助创建并方便地维护这些信息,如图4-8所示。
例如:
需要修改公司名称,可按照下列步骤:
(b)在ResourceView中,双击版本信息资源(VS_VERSION_INFO)
(c)在对象列表中找到项目:
CompanyName
(d)左键单击“CompanyName”,出现文本框,填入合适的内容。
同样的步骤可以修改其他版本信息。
图4-8版本信息编辑器
(6)字符串编辑器
字符串列表包括了一个应用程序中所有标识符的ID、数值和名称。
例如,状态栏的提示。
使用字符串编辑器可以创建或编辑一个字符串,如图4-9所示,常用操作包括:
1查找一个字符串记录
2增加一个字符串记录
3删除一个字符串记录
4移动一个字符串记录到另一个段
5移动一个字符串记录到另一个资源文件(*.rc)
6改变一个字符串的值或它的ID
7增加格式或特殊字符到一个字符串
注意:
不能创建一个空字符串表,如果创建了一个空的字符串表,DevelopStudio在退出的时候会自动删除。
图4-9 字符串编辑器
(7)图形编辑器
图形编辑器是用于画位图、图标和鼠标的工具,同时支持工具栏位图的创建,如图4-10所示。
图4-10 图形编辑器
3保存或删除资源
从前面的讲述中可以知道,开发者使用可视化界面编辑资源的信息,由Developstudio自动保存在.rc和.h两个文件中。
当使用资源编辑器修改了资源,在ResourceView中树形结构的根结点文件夹的最右边会出现‘*’,表示修改后还未存盘。
保存操作是执行菜单命令File->
SaveAll,保存后‘*’号将消失。
要删除一个资源,只需在ResourceView的树目录中选中该资源的ID图标,直接单击“Delete”按键,该资源将从资源管理器中删除。
4.1.3编辑器使用实例
【例4-1】文本编辑器的实现。
要求文本编辑器可以在视图窗口内接收键盘输入并编辑文本,能将文本存盘并从磁盘装入文本文件;
具有撤消、选择、复制、剪切、粘贴、查找、替换等功能,基本上实现类似记事本的功能。
同时需要修改该编辑器的程序图标。
设计思路:
MFC类库的CEditView类不仅提供了在视图中使用CEdit控件的功能,还提供了实现简单文本编辑器的功能,因此,只要在用AppWizard生成Exam4_1的基本框架时,选择从CEditView类派生应用程序的视图类CExam4_1View,就能生成文本编辑器的基本框架。
根据对文本编辑器的要求,还须在“编辑”菜单下增加“全选”、“查找”、“查找下一个”、和“替换”4个菜单项。
实现后的应用程序运行窗口如图4-11所示。
图4-11实现的文本编辑器
实现步骤:
1用AppWizard生成应用程序的基本框架
(3)在VC集成开发平台,单击File菜单中的New菜单项,打开New对话框。
(4)在New对话框中,选择Project标签,单击MFCApplication(EXE)。
(5)在右边填写工程名称:
Exam4_1,并确定工程文件保存位置。
(6)单击“OK”按钮,在MFCAppWizard-Step1of6对话框中,选择应用程序的类型为SingleDocument。
(7)连续单击5个“Next”按钮,接受向导默认设置,进入到MFCAppWizard-step6of6对话框中,在类的列表中选中CExam4_1View,在Baseclass下拉框中选择CEditView。
(8)单击“Finish”按钮,显示NewProjectInformation对话框,单击“OK”按钮,回到集成开发平台。
(9)选择Build菜单中的ExecuteExam4_1.exe菜单项,运行该应用程序。
2增加文本编辑器的菜单项
(4)展开ResourceView标签中的Menu菜单资源,双击IDR_MAINFRAME,打开菜单编辑窗口。
(5)在“编辑”菜单项底部依次加入“全选”、“查找”、“查找下一个”和“替换”菜单项,各菜单项的属性如表4-2所示。
(6)在“全选”菜单项后,应插入一个分隔线,分隔线是一个特殊的菜单项,只要在属性窗口中选取Separator复选框即可,不用输入ID和Caption内容。
表4-2菜单属性设置
菜单ID
菜单名(Caption)
ID_EDIT_SELECT_ALL
全选(&
A)\tCtrl+A
ID_EDIT_FIND
查找(&
F)\tCtrl+F
ID_EDIT_REPEAT
查找下一个(&
N)\tF3
ID_EDIT_REPLACE
替换(&
R)\tCtrl+H
(15)最终在菜单编辑器完成的“编辑”菜单如图4-11所示,保存后重新运行程序。
说明:
3一个菜单项与一个菜单ID相对应,经消息映射后与一条菜单消息相对应,选择一个菜单项系统将自动调用相应的菜单消息处理函数
4一个菜单若具有下级菜单,不对应菜单ID
5在此程序中,因加入的菜单命令是标准的MFC菜单命令ID标识符,即CEditView类中定义的消息映射能自动将每个命令消息发送到相应的消息处理函数,所以不用再定义消息处理函数
6添加菜单命令的加速键(Accelerator)
(1)展开ResourceView标
(2)签中的Accelerator加速键资源,(3)双击IDR_MAINFRAME,(4)打开加速键编辑窗口。
(5)双击加速键清单底部的空框,(6)打开AccelProperties对话框。
(7)在ID栏输入:
IDR_EDIT_SELECT_ALL,(8)在“Key”编辑框中输入A,(9)右边单选钮保留默认值,(10)关闭对话框。
同(11)样的方法定义“查找”和“替换”的加速键。
(12)完成“查找下一个”的加速键F3的定义方法有所不同(13):
先输入ID,(14)再选择右边“ASCII”单选钮,(15)单击“NextKeyTyped”按钮,(16)再按键盘上的“F3”键。
(17)保存后重新运行程序,(18)使用加速键来执行菜单命令。
7修改文本编辑器的默认文件扩展名为(.txt)
在字符串编辑器中修改文本编辑器的默认文件扩展名。
(4)展开ResourceView标签中的StringTab字符串资源,双击IDR_MAINFRAME,打开字符串编辑窗口如图4-12所示。
图4-12字符串编辑器窗口
字符串编辑器窗口中列出的第一个字符串表识符为IDR_MAINFRAME,这个字符串是AppWizard生成的,由7个子串组成(\n为子串的分隔符),包含Exam4_1程序的特定消息。
其当前值为:
Exam4_1\n\nExam4_\n\n\nExam41.Document\nExam4_Document
双击该行中的任意位置,打开StringProperties对话框,如图4-13所示。
在Caption文本框中修改字符串,分别修改第四、第五子串,结果如下:
Exam4_1\n\nExam4_\nExam4_1文件(*.txt)\n.txt\nExam41.Document\nExam4_Document
图4-13字符串属性对话框
第四子串的内容“Exam4_1文件(*.txt)”是“打开”或“保存为”对话框显示在“文件类型:
”或“保存类型:
”列表框中的程序默认文件扩展名;
第五子串的内容“.txt”是程序默认文件扩展名本身。
(5)保存后重新运行程序。
7修改文本编辑器的程序图标
(6)展开ResourceView标签中的Icon位图资源,双击IDR_MAINFRAME,打开图形编辑窗口,显示当前程序图标。
(7)运用画图工具栏对Icon进行修改。
图标数据以二进制的形式存放在Exam4_1.ico文件中。
(8)保存后重新运行程序。
4.2菜单的使用
4.2.1菜单的类型
菜单是由MFC菜单类(CMenu)来创建的,CMenu是从CObject类派生的,它在MFC类库中的层次位置如图4-14所示。
图4-14CMenu类
在一个窗口应用程序中,菜单的组成分成两大类:
顶层菜单和弹出菜单。
顶层菜单是指出现在应用程序的主窗口或最上层窗口的菜单;
弹出菜单通常是指选择顶层菜单或一个菜单时弹出的子菜单。
1.顶层菜单(top-levelmenu)
一个顶层菜单由菜单名和菜单项构成。
菜单名指出一组菜单项命令的主要功能和目标。
常见的顶层菜单有:
“File”、“Edit”、“Windows”、“Help”等。
一个菜单项是可选择或可执行的,对应一个确定的功能。
2.弹出菜单(pop-upmenu)
本节将介绍三种弹出菜单:
下拉菜单、子菜单和快捷菜单,如表4-3所示。
表4-3弹出菜单的类型
菜单类型
介绍
下拉菜单(Drop-downmenus)
当一个顶层菜单列表中的菜单项被选中,会显示下拉菜单
子菜单(Submenus)
当一个菜单项被选择时,有继续选择菜单的要求,子菜单会显示。
菜单项右边的三角符号就表示有子菜单的存在。
快捷菜单(Shortcutmenus)
当右击鼠标键的时候,弹出一个包含相关命令的快捷菜单。
快捷菜单出现在鼠标箭头的位置。
在通常情况下,使用AppWizard生成一个应用程序框架时,定义了一个默认的菜单资源“IDR_MAINFRAME”,创建窗口时加载该资源。
该菜单资源包括标准菜单,例如,在“File”菜单中的“New”和“Open”。
要增加更多的菜单需要经过下面两步:
(1)使用菜单编辑器创建菜单;
(2)使用ClassWizard创建菜单命令消息处理函数,(3)编写代码支持菜单所要实现的功能。
4.2.2添加并设置菜单项
菜单编辑器的主要操作包括:
1.插入新菜单项
在当前空白菜单框位置插入,选定窗口中的空白菜单框后按回车(或双击空白菜单框),系统弹出MenuItemProperties对话框。
例如在应用程序Exam4_1的“查看”菜单插入一个新的菜单项“版本”,如图4-15所示编辑对话框。
图4-15菜单编辑器和属性对话框
在某菜单项前插入,选择该菜单按“Ins”键,菜单编辑器将在该菜单前插入一个空白菜单项,然后双击该空白菜单项进行编辑。
(1)插入一条分割线
要插入一个分割线,分割线实际也是一个菜单项,只要在对话框中选择Seperator属性即可。
(2)增加子菜单
要为一个菜单增加子菜单,只要在对话框中选择Pop-up属性即可。
(3)调整菜单项位置
选中某菜单项将其拖至适当位置即可。
(4)属性对话框的设置
在ID文本框中,输入菜单选项的资源符号,可从键盘输入,也可选取系统已定义的ID号。
“ID_VIEW_VERSION”是用户自定义输入的,例4-1中的“ID_EDIT_FIND”是系统已定义的ID号。
在Caption文本框中,输入菜单选项名。
如:
“版本(&
V)\tCtrl+F12”,其中,“(&
V)”是给菜单定义的热键为V字母,在热键字母前需加符号&
;
“\tCtrl+F12”说明菜单的加速键为“Ctrl+F12”,转移字符“\t”为使加速键都按右对齐显示。
在Prompt文本框中,输入描述性的文字,是为菜单定义在状态栏显示的提示。
这样,只要选中该项,系统将在状态栏提示相应的描述性的文字。
在文本串的最后可以加上工具按钮的提示文本,即“\n”后的文本,如上图中的“Version”是对应工具按钮下方的提示。
2.删除菜单项
用鼠标单击该菜单项或用上下左右光标键选择,然后按“Del”键删除。
4.2.3菜单命令处理
当添加了一个用户自定义的菜单项,并设置完菜单项属性后,若立即执行应用程序,可以看到该菜单项呈灰色,不可选择,必须为该菜单项增加菜单命令消息处理函数和相应支持代码。
菜单命令消息处理函数就是用户选择一个特定菜单项而产生的菜单消息映射函数。
MFC使用ClassWizard管理一个菜单命令消息处理函数,如图4-16所示,例如创建上节菜单命令“版本”的菜单命令消息处理函数的步骤如下:
(3)打开ClassWizard,在Classname下拉列表中选择增加的菜单命令消息处理函数所属的类,本例选择CMainFrame。
(4)在ObjectIDs列表中选择菜单项ID:
ID_VIEW_VERSION。
(5)在Messages列表中选择COMMAND。
(6)单击“AddFunction”,弹出函数名称确认对话框,接受默认函数名,单击“OK”按钮。
(7)单击“EditCode”,增加代码如程序清单4-1所示,实现版本信息显示。
(8)重新编译运行程序,执行菜单命令“版本”。
程序清单4-1:
菜单命令消息处理函数显示版本信息
voidCMainFrame:
:
OnViewVersion()
{
//TODO:
Addyourcommandhandlercodehere
MessageBox("
Exam4_1ofVersion1.0!
"
);
}
图4-16增加命令处理函数
菜单命令消息映射函数增加在哪一个类中,主要取决于哪一个类与函数所执行的功能相关。
例如,一个菜单命令如果要输出一个图像,菜单命令消息映射函数应增加在视图类,因为视图类能方便地访问CDC对象实现图像输出。
4.2.4更新菜单的显示
设计菜单显示,应该考虑到用户在选择有些菜单命令时,希望看到选择留下的痕迹,例如,在“我的电脑”文件夹窗口中,通过菜单命令“查看”可以选择文件和文件夹显示的方式,用户作选择后,相应的菜单项的左边会出现一个圆点。
MFC通过消息映射机制和CCmdUI类实现更新菜单的显示。
当用户点击菜单时,窗口操作系统发送WM_INITMENU或WM_INITMENUPOPUP消息到窗口框架,窗口框架调用与该菜单命令相关联的菜单命令更新处理函数,菜单项的更新就产生了。
CCmdUI类提供了支持更新菜单显示的功能函数,例如CCmdUI:
Enable()函数可以设置菜单项是否有效,当参数值为false时,菜单项无效,呈灰色显示;
当参数值为true时,菜单项有效,可以被执行。
CCmdUI提供的更新菜单显示的成员函数如表4-4所示。
表4-4CCmdUI的成员函数
成员函数
描述
Enable
设置菜单项是否有效
SetCheck
增加或清除‘√’标记
SetRadio
增加或清除圆点标记
SetText
改变菜单显示文本
应用程序如果需要在运行过程中更新菜单项的显示,就要为该菜单项映射菜单命令更新处理函数,增加代码,实现更新。
下面通过一个例子来熟悉菜单更新操作。
【例4-2】在应用程序Exam4_1的“查看”菜单中增加菜单项“大”,该菜单项为切换菜单,要求增加切换标记,并且使菜单项名称随选择次数逢3在“大”“中”“小”三个菜单名称之间循环变换。
具体实现步骤如下:
(3)打开菜单编辑器,在“查看”菜单中增加菜单项ID为ID_VIEW_BIG,Caption为“大”。
(4)为CMainFrame类增加Public访问权限的int型成员变量count,并在该类的构造函数中设置初值为0。
(5)打开ClassWizard,Classname列表中选择CMainFrame,ObjectIDs列表中选择ID_VIEW_BIG,Messages列表中分别选中COMMAND和UPDATE_COMMAND_UI消息,单击“AddFunction”按钮,增加命令处理函数和菜单更新处理函数。
(6)单击“EditCode”按钮,为新增的函数添加代码,代码参考程序清单4-2。
(7)运行程序,连续选择菜单项ID_VIEW_BIG,观察菜单项的改变。
程序清单4-2:
更新菜单显示
OnUpdateViewBig(CCmdUI*pCmdUI)
AddyourcommandupdateUIhandlercodehere
if(count%2)
pCmdUI->
SetCheck(true);
else
SetCheck(