/* 第十四章 处理菜单和工具栏 1 基于MFC的程序如何处理消息 2 菜单资源,如何创建和修改菜单资源 3 菜单属性,如何创建和修改菜单属性 4 如何创建函数,以便为选择菜单项时生成的消息提供服务 5 如何添加处理程序,以更新菜单属性 6 如何添加工具栏按钮,如何把它们和现有菜单项关联起来 14.1 与Windows进行通信 14.1.1 了解消息映射 注意: 查看一个.h文件时有一个很好的捷径,如果这个文件的名称出现在Editor窗口中,只需要右击它,然后从弹出式菜单中选择OPen Document "Filename.h", 这种方式也适用于标准库头文件 14.1.2 消息类型 程序可能要处理的消息有三种 Windows消息,这些消息都是以前缀WM_开始的标准Windows消息,我们将要遇到的WM_COMMAND消息除外,Windows消息的示例有表示需要重画窗口客户区的WM_PAINT,以及表示已释放鼠标左键的WM_LBUTTONUP 控制通知消息 这些消息是的WM_COMMAND消息,从控件(如列表框)发送到创建该控件的窗口,或者从子窗口发送到父窗口 与WM_COMMAND消息相关联的参数可以区分从应用程序控件发送的消息 命令消息 这些消息也是WM_COMMAND消息,它们由用户界面元素产生,如菜单项和工具栏按钮,MFC为标准菜单和工具栏命令消息定义了独特的标识符 14.1.3 处理程序中的消息 不能把一个消息的处理程序放在您喜欢的任何地方,放置处理程序的许可位置取决于要处理的消息的类别 如何处理命令消息 所有的命令消息都将发送到应用程序的主框架窗口,然后主框架窗口将按照一个特定的顺序把这个消息传送给程序中的类,如果一个类不能处理这个消息,它将把这个消息传递给下一个类 对于SDI程序来说,类处理的命令消息的顺序是: 1 视图对像 2 文档对像 3 文档模板对像 4 主框架窗口对像 5 应用程序对像 在MDI程序中,传送命令消息的顺序是: 1 活动视图对像 2 与活动视图相关联的文档对像 3 活动文档的文档模板对像 4 活动视图的框架窗口对像 5 主框架窗口对像 6 应用程序对像 14.2 扩充Sketcher程序 添加菜单到Sketcher程序的步骤是: 定义要出现在主菜单栏和每个菜单中菜单项 决定应用程序中哪里些类应当处理每个菜单项的消息 添加消息处理函数到菜单消息的类中 添加函数到类中,以更新菜单的外观,显示当前有效的选择 添加工具栏按钮以及每个菜单的工具提示 14.3 菜单的元素 菜单出现在应用程序中时的创建和修改,以及选择特定菜单项时需要的处理-为菜单项定义消息处理程序, 创建和编辑菜单资源 1 添加菜单项到菜单栏中 现在显示需要把消息类型指定为这个对话框中显示的一种备选类型,Message type:框显示了对于特定的菜单ID可能出现的2种消息,在处理菜单项时,每种消息适合于不同的目的 COMMAND 在选择了特定的菜单项时将发出这种消息,处理程序应当提供适合于所选菜单项的动作,例如,设置文档对像中的当前颜色,或者设置元素类型 UPDATE_COMMAND_UI 取决于菜单的状态,在应当更新-例如复选或未选中--菜单时将发出这种消息,这种消息出现在显示弹出式菜单之前,所以您可以在用户看到这个菜单项的外观之前进行设置 14.4.1 选择处理菜单消息的类 我们希望元素类型和元素颜色为模态,也就是说,无论对元素类型和元素颜色进行什么设置,在被修改之前,它们应当一直有效,这样,就可以根据需要的数量创建蓝色圆,在需要红色圆时,只需要修改一下颜色, 14.4.2 创建菜单消息函数 14.4.3 编写菜单消息函数的代码 针对这些新菜单项,现在考虑应当如何处理COMMAND消息,前面已经讲过,我们想把当前元素和颜色记录在文档中,所以需要针对每个菜单项把数据成员添加到CSketcherDoc类中 1 添加存储颜色和元素模式的成员 2 初始化新的类数据成员 修改类构造函数 3 运行扩充后的示例 14.4.4 添加更新用户界面的消息处理程序 要正确的设置新菜单的复选标记,需要为每个新的菜单项添加一种新的消息处理程序UPDATE_COMMAND_UI(表示更新命令用户界面),这种消息处理程序专门用于在显示一个菜单项之前更新它的属性 1 编写命令更新处理程序的代码 2 运用更新处理程序 在添加了所有更新处理程序的代码以后,可以再次构建和执行Sketcher应用程序 14.5 添加工具栏按钮 14.5.1 编辑工具栏按钮的属性 14.5.2 练习使用工具栏按钮 14.5.3 添加工具提示 14.6 C++/CLI程序中的菜单和工具栏 14.6.1 理解的Windows Forms Windows Forms是创建和CLR一起执行的Windows应用程序的工具 创建Windows Forms项目之后,在Windows Forms应用程序的开发中有四种截然不同的操作: 1 在Editor窗格中显示的Form Design选项卡中交互式地创建GUI,方法是在Toolbox窗口中选择控件,将这些控件放置到窗体中,也可以创建额外的窗体窗口 2 在Properties窗口中修改控件和窗体的属性以符合应用程序需求 3 可以创建控制的Click事件处理程序,方法是在From Disign选项卡中双击该控件 也可在控件的Properties窗口中,设置某个已有的函数为该控件某个事件的处理程序 4 可以修改和扩展过与Form Design选项卡交互而自动创建的类,以满足应用程序的需要求 14.6.2 理解Windows Forms应用程序 六个用于.NET库命名空间的using指令,这些指令覆盖了在应用程序中最可能需要使用的库功能,这些命名空间如下 System 该命名空间包含定义数据类型的类,这些数据类型用于所有的CLR应用程序中,该命名空间也包含用于事件和事件处理,异常的类以及支持常用函数的类 System::ComponentModel 该命名空间包含支持CLR应用程序中GUI组件操作的类 System::Collections 该命名空间包含用于以各种方式组织数据的集合类,并且包括用于定义列表,队列,字典(映射)和栈的类 System::Windows::Forms 该命名空间包含支持在应用程序中使用Windows Forms的类 System::Data 该命名空间包含支持ADO.NET的类,ADO.NET用于访问和更新数据源,在下一章将介绍更多关于在CLR应用程序中访问数据源的知识 System::Drawing 该命名空间定义支持基本图形操作的类,例如在窗体或组件上绘图 1 修改窗口的属性 2 应用程序的启动方式 14.6.3 在CLRSketcher中添加菜单 14.6.4 添加菜单项的事件处理程序 在C++/CLI程序中,时间处理程序就是委托,但是在实践中几乎不需要知道这一点,因为将自动创建作为委托的所有函数,通过单击返回到Design选项卡,接下来可以开始为Element菜单中的菜单项添加处理程序 14.6.5 实现事件处理程序 14.6.6 设置菜单项复选 14.6.7 添加工具栏 14.7 小结 1 MFC在消息映射中定义一个类的消息处理程序,消息映射出现在该类的.cpp文件中 2 命令消息由菜单和工具栏产生,可以在派生于CCmdTarget的任何类中对这些消息进行处理 这些类包括应用程序类,框架和子框架窗口类,文档类以及视图类 3 对于命令消息以外的消息,只能在派生于CWnd的类中对它们进行处理,这些类包括框架窗口类和视图类,但不包括应用程序类或文档类 4 MFC有一个预定义的序列,它可以搜索程序中的类,以发现命令消息的消息处理程序 5 始终应当使用Event Handler Wizard把消息处理程序添加到您的程序中 6 菜单和工具栏的特理外观在资源文件中定义,它们由内置的资源编辑器进行编辑 7 菜单中可以产生命令消息的菜单项由带有前缀ID的符号常量标识,这些ID用来将处理程序和菜单项发出的消息关联起来 8 要把一个工具栏按钮和一个特定的菜单项关联起来,需要给这个按钮赋予一个与该菜单项相同的ID 9 要给一个对应于菜单项的工具栏按钮添加工具提示,需要在String Table资源的标题列中,把工具提示文本添加到该菜单项的ID的输入中,工具提示文本和菜单提示文本之间由\n隔开 */