1、菜单以及与菜单相关联的操作消息的分类 标准消息除 WM_COMMAND之外,所有以 WM_开头的消息。从 CWnd派生的类,都可以接收到这类消息。 命令消息来自菜单、加速键或工具栏按钮的消息。这类消息都以 WM_COMMAND呈现。在 MFC中,通过菜单项的标识( ID) 来区分不同的命令消息;在 SDK中,通过消息的 wParam参数识别。从 CCmdTarget派生的类,都可以接收到这类消息。 通告消息由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以 WM_COMMAND形式呈现。从 CCmdTarget派生的
2、类,都可以接收到这类消息。一个类接收一个命令消息后,文件做了哪些修改?( a)在类的定义中的消息映射中添加命令消息函数原 型(b)在源文件的消息映射中用 ON_COMMAND宏将菜单项的ID号和命令消息响应函数进行关联( c)在源文件中增加了命令消息响应函数。它的形式跟 Windows标准消息是一样的,不同的是ON_COMMAND宏。标准的 Windows消息 的路由:直接在消息映射表中上溯,在消息映射表中查找,如果吻合就调用表中所记录的消息处理程序。命令消息 的路由呢?命令消息的路由AfxWndProcAfxCallWndProcWindowProcOnWndMsgOnCommand OnN
3、otifyOnCmdMsg视图类 - 文档类 -框架类 - 应用类命令消息接收物的 类 型 处 理次序Frame窗口 1、 View2、 Frame窗口 对 象3、 CWinApp对 象View 1、 View本身2、 DocumentDocument 1、 Document本身2、 Document Template添加 2个菜单, ID值分别为 IDM_UNDO和IDM_DELETE_ALL,分别用来删除最后画的一条直线和窗口中所有的直线。( 1)为视图类添加对这 2个菜单项的消息响应( 2) OnUndo() int nUpperBound=m_ptrArray.GetUpperBoun
4、d ();if(nUpperBound0)return;CLine *pline=(CLine *)(m_ptrArray.GetAt (nUpperBound );delete pline;m_ptrArray.RemoveAt (nUpperBound);Invalidate();(3) OnDeleteAll() int nCount=m_ptrArray.GetSize ();for(int i=0;inCount;i+)delete m_ptrArray.GetAt (i);m_ptrArray.RemoveAll ();Invalidate();命令更新 菜单项状态的维护是依赖于 CN_UPDATE_COMMAND_UI消息,谁捕获 CN_UPDATE_COMMAND_UI消息, MFC就在其创建一个 CCmdUI对象。可以通过手工或利用 ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获 CN_UPDATE_COMMAND_UI消息。