MFC编程案例chapter006.pdf
《MFC编程案例chapter006.pdf》由会员分享,可在线阅读,更多相关《MFC编程案例chapter006.pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载下载下载第6章 菜单让用户以全新的和令人兴奋的方式与应用程序进行交互时,那些普通的旧菜单往往被忽视;当用应用程序向导创建一个应用程序时,它自动为主窗口创建一个通用的菜单,但只要用一点点的努力,就可以使它们看起来更加美观动人。例12 使用菜单编辑器用菜单编辑器添加新增的命令到由 A p p Wi z a r d产生的菜单。例13 添加一个菜单命令处理函数用C l a s s Wi z a r d自动将菜单单击命令与处理命令的某个类的成员函数相联系。例14 根据当前可视文档动态改变菜单讨论每逢打开一个特定的视图时,怎样用新命令自动更新一个主菜单。例15 启用和禁用菜单命令讨论怎样灰化和正常化菜
2、单项。例16 复选标记菜单命令讨论怎样在菜单项的边上放置复选标志,用以指示它们当前状态。例17 单选标记菜单命令放置一个点到一组菜单项边上,用以指示当前组中边上有点的菜单项是活动的。例18 动态修改菜单讨论程序运行时添加一个菜单项到菜单中,以及从菜单中删除一个菜单项。例19 动态修改系统菜单讨论怎样添加命令到系统菜单,系统菜单是单击应用程序图标时显示的菜单。例20 触发一个菜单命令讨论怎样使一个菜单项在程序中被“击中”。例21 创建弹出式菜单当用户在应用程序视图内右击鼠标时,将创建一个浮动菜单。6.1 例12 使用菜单编辑器目标添加、删除、改变应用程序菜单中的一个命令,或创建一个新菜单。注意
3、给菜单添加的任何菜单项,在为它添加菜单命令处理函数之前,将显示灰色,并且是无效的。参见下面“怎样添加一个处理函数”。步骤用菜单编辑器添加一个菜单项到菜单中1)要创建一个新的菜单,单击 Developer Studio的I n s e r t/R e s o u r c e菜单命令,打开“I n s e r tR e s o u r c e(插入资源)”对话框,从列表中选择“M e n u(菜单)”并单击N e w。2)要编辑一个已有的菜单,在应用程序资源的文件夹中找到相应菜单的 I D,并双击它。3)要添加一个新的菜单项到菜单中,用鼠标拖动空白焦点矩形到新菜单项的位置(见图6-1)。图6-1
4、拖动空焦点矩形到一个新位置,以添加一个菜单项到该菜单4)然后,双击或右击该矩形,选择P r o p e r t i e s(属性)以打开属性对话框(见图6-2)。5)在I D域定义个人的菜单I D,如果用户不输入任何I D,则系统自动创建一个I D,当单击该菜单项时,该I D成为命令I D发送到应用程序。6)在C a p t i o n(标题)域输入菜单项的文本,在字符前面添加一个&号表示用户可以通过键盘访问该菜单项,该字符在菜单中显示一个下划线。7)在P r o m p t(提示)编辑框中填入帮助消息,当鼠标指到该项时,该消息将出现在状态栏上。在该提示的后面添加一个换行符(n),然后添加一个
5、更小的帮助消息。该更小的消息(也叫做气泡帮助消息)将显示在任何产生该命令的工具栏按钮上面。在这里可以看出,第一消息可以是详细的消息,而第二消息应该简单明了。Opens the file system.nOpen File8)可以忽视C h e c k e d、G r a y e d和I n a c t i v e复选框,因为在运行时可以动态地改变这些属性(见例1 5)。如果只想让该菜单项在菜单中显示一个分隔符,则选中S e p a r a t o r复选框(见图6-3)。9)对于菜单条项,如果想使该菜单项和所有它管辖之下的菜单项在菜单条上右对齐,则选取H e l p复选框(见图6-4)。10)
6、如果想把大菜单分割成几列,则在新列开始处选取 B r e a k。C o l u m n只是创建一个新列,而B a r创建一列,然后在它和最后一列之间添加一个分隔符,图6-5显示了一个没有条的菜单。注意一些菜单属性(包括列分割)不能在正在编辑的菜单图像中反映出来,只有在应用程序建立并运行时,这些属性才能显示出来。11)修改一个已有的菜单项,只要用鼠标选取它,并打开它的属性对话框;要删除一个菜单项,用鼠标选中它,然后按键盘上的 D e l e t e键。108第二部分 用户界面实例下载拖动空白焦点矩形为新项在菜单上占据一个位置图6-2 用属性对话框改变菜单项的属性没有菜单命令的分隔符图6-3 选
7、中Separator复选框以添加一个菜单分隔符“Help”属性使它自己和所有它所辖的菜单命令右对齐图6-4 选取菜单条中的Help复选框项用“Column”分隔,菜单只是分割成多列,而用“B a r,”在列之间显示一个分割符图6-5 选择Break/Column把大菜单分隔成多列第6章 菜单109下载说明也可以动态地创建一个菜单(见例2 1)CD说明在C D上没有该例相应的工程。6.2 例13 添加一个菜单命令处理函数目标用C l a s s Wi z a r d自动添加一个菜单命令处理函数到一个类中,该处理函数实际上是该类的一个成员函数。当一个菜单项被单击时,该函数被 M F C的消息映像系
8、统调用。C l a s s Wi z a r d添加的函数开始是空的。步骤1.用C l a s s Wi z a r d添加一个命令处理函数1)单击Developer Studio的Vi e w/C l a s s Wi z a r d菜单命令,打开C l a s s Wi z a r d对话框,从类名组合框中找到并选取用来处理菜单命令的类。注意 虽然一个类名可能显示在该组合框中,但用它来处理菜单命令仍可能是不合法的,参见本节的“说明”部分。2)对象I D列表框包括了所有可得菜单和工具栏命令的 I D,找到合适的I D,并选取它,然后从M e s s a g e s列表框中选择C O M M
9、A N D;现在,单击Add Function按钮真正地添加该命令处理函数到该类中,单击Edit Function使环境的文本编辑器打开该类的文件,并定位在该新增函数处,该函数在开始时没有任何代码。这时,运行应用程序,与它关联的菜单项变得有效,但是,单击它显然没有任何反映。3)参见图6-6以讨论这些步骤。图6-6 遵循这些步骤用ClassWizard添加一个菜单命令2.用C l a s s Wi z a r d删除一个命令重复添加一个命令处理函数的步骤,但是,最后单击Delete Function按钮,要求C l a s s Wi z a r d从类中删除该菜单处理函数。事实上,所有 C l
10、a s s Wi z a r d删除的是该函数在消息映像中的项,而要从.c p p文件中删除真正的函数还得由你来完成。单击“Add Function”添加成员函数到该类中,用以处理该菜单命令单击“COMMAND”确定处理该命令的类在“Object IDs”列表框中查找菜单命令说明如果在 M e s s a g e列表框中选择 U P D AT E _ C O M M A N D _ U I而不是 C O M M A N D,则C l a s s Wi z a r d添加一个用户界面更新处理函数到类中。该处理函数允许用户检查标志、禁用菜单项,甚至改变菜单项文本(见例1 5与例1 6)。在添加一个
11、命令处理函数到应用程序中,用以支持一个新的菜单命令之前,那个菜单项命令是灰色的并且是无效的。如果不想为所有的菜单项添加处理函数并使它们看起来有效,可以添加下面的代码到C M a i n F r a m e类的构造函数中。C M a i n F r a m e:C M a i n F r a m e()m_bAutoMenuEnable=FA L S E;尽管C l a s s Wi z a r d允许用户为项目中的每个类添加一个命令处理函数,M F C的消息处理系统也可能不能顺利的调用那个类来处理命令消息,菜单命令消息跟踪一组路径到达应用程序类,这在第3章已经简述过。在大多数情况下,类可能是在
12、该路径下,尤其是那些A p p Wi z a r d创建的类。然而,若添加一个新类到应用程序,可能需要手工把路径插入消息流中(见例6 1)。CD说明在C D上没有该例相关的工程。6.3 例14 根据当前可视文档动态改变菜单目标在一个M D I应用程序中,根据当前看到的文档显示一个不同的菜单(见图6-7)。策略当在M D I应用程序中注册多种类型文档模板时,可以轻松获得该功能:一个 M D I应用程序可以编辑多种类型文档,根据当前正在编辑的内容,利用该特征,添加特定的命令到菜单条中。例如,Developer S t u d i o的I m a g e菜单命令,它只在编辑图像时出现(如位图、图标等
13、)。步骤在应用程序类中定义一个新的文档模板1)用I D编辑器为该文档类型创建新的I D。在本例中,我们用I D R _ W Z D T Y P E 1。2)选择Wo r k s p a c e窗口的R e s o u r c e Vi e w,并打开M e n u文件夹,找到应用程序当前菜单的菜单I D,选中它,然后按C t r l+C和C t r l+V复制它。通过右击该复制的 I D并单击P r o p e r t y,给它设置新文档类型的I D。110第二部分 用户界面实例下载“Test”菜单项只在某种类型的视图选中时才会显示图6-7 注册多个文档模板类型以根据观察到的文档改变菜单3)重
14、复上一步为该文档类型创建一个图标,图标位于 I c o n文件夹中。4)重复上一步在串表中创建一个新文档串类型,串表位于 String Ta b l e文件夹中,找到下面这样的串:IDR_WZDTYPE nWzdnWzdnnnWzd.DocumentnWzd Document还应当改变这些值以反映新的文档类型。现在,只要在每次提到应用程序名字的后面填加1,本例中是W z d。5)用C l a s s Wi z a r d有选择地创建一个新视图类和新文档类。参看例 1,确定从哪个M F C类派生类。6)现在,可以使用创建的资源和类,在应用程序类中创建一个新的文档模板。直接把下面的代码添加到创建当
15、前文档模板代码的后面。p D o c Template=new CMultiDocTe m p l a t e(I D R _ W Z D T Y P E 1,new document id typeR U N T I M E _ C L A S S(C W z d D o c),new document classRUNTIME_CLASS(CChildFrame),MDI child frameR U N T I M E _ C L A S S(C W z d 2 Vi e w);E n a b l e(m _ b W z d);说明当应用程序首次打开一个菜单时,它将查看在该菜单中每个菜单
16、项是否有一个U P D AT E _ C O M M A N D _ U I消息处理函数;如果没有,应用程序就检查该菜单项是否有某种C O M M A N D消息处理函数,如果也没有这样的处理函数,应用程序会自动地禁用该菜单项,并使它显示灰色。通过在 C M a i n F r a m e的构造函数中把m _ b A u t o M e n u E n a b l e设为FA L S E,可以禁用该自动功能。在软件开发中,该功能有助于提醒用户还有什么没做。应用程序不仅可以启用和禁用菜单项,也可以启用和禁用工具栏按钮、对话条控件和状态栏面板。因为这些条中的控件总是可视的,应用程序一有空闲就更新这
17、些控件。对话框,无论是有模式还是无模式都不受影响。作为一个用户,我总是不喜欢禁用的菜单项和工具栏按钮,因为知道有个命令不能用,但不知道为什么不能用,或不知道怎样使它可用。因此,我建议不要禁用一个菜单项,而是显示一个消息框,用以指示一个菜单项是不能用的,并告知怎样使它可用有关用C l a s s Wi z a r d的例子参见例1 3,要更多了解M F C怎样更新用户界面,参见第 3章以及下个例子。CD说明在C D上执行相应的项目时,O p t i o n s下的W z d菜单命令显示无效。6.5 例16 复选标记菜单命令目标给菜单项添加一个复选标志(见图6-9)。策略用C l a s s Wi
18、 z a r d添一个用户界面消息处理函数,它允许我们复选任何菜单项。112第二部分 用户界面实例下载图6-9 添加一个用户界面消息处理函数,以复选框标记一个菜单命令第6章 菜单113下载步骤用C l a s s Wi z a r d添加一个用户界面处理函数遵循前一个例子中的步骤,添加一个用户界面处理函数到一个应用程序类中,但现在使用C C m d U I的另一个成员函数来复选标记该菜单项。void CWzdVi e w:O n U p d a t e W z d Type(CCmdUI*pCmdUI)p C m d U I-S e t C h e c k(m _ b W z d);说明每次打
19、开一个菜单时,M F C允许更新菜单中每个菜单项的状态。M F C构造了一个包含C M e n u对象的C C m d U I类对象,C M e n u对象封装了菜单对象和用来更新菜单项所需的任何消息;然后,M F C使用与发送命令消息到类相同的方法,把 C C m d U I对象传递给你,它允许在实际处理命令的相同的地方更新菜单项状态。C C m d U I被重载,以便为复选一个菜单项而编写的代码,也可以按下一个工具栏按钮。M F C只为代码传递一个或其他C C m d U I,以便SetCheck()能复选一个菜单项或按下一个按钮。每次打开菜单项时,菜单项被更新;每次应用程序空闲时,工具栏
20、按钮被更新。有关使用C l a s s Wi z a r d的例子参见例1 3;有关M F C怎样更新用户界面的消息,参见第 3章及前一个和后一个例子。CD说明执行C D上的工程时,O p t i o n s/W z d命令显示一个复选标志。6.6 例17 单选标记菜单命令目标在一组菜单项的边上显示一个点,用以反映一个变化模式(见图6-1 0)。策略使用C l a s s Wi z a r d,为组中的每个菜单项添加一个界面消息处理函数,它允许我们在当前菜单模式边上画一个点。步骤1.用C l a s s Wi z a r d添加命令处理函数到一组菜单项用C l a s s Wi z a r d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 编程 案例 chapter006
限制150内