资源描述
菜单以及与菜单相关联的操作,消息的分类,标准消息除WM_COMMAND之外,所有以WM_开头的消息。从CWnd派生的类,都可以接收到这类消息。命令消息来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。通告消息由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接收到这类消息。,一个类接收一个命令消息后,文件做了哪些修改?(a)在类的定义中的消息映射中添加命令消息函数原型(b)在源文件的消息映射中用ON_COMMAND宏将菜单项的ID号和命令消息响应函数进行关联(c)在源文件中增加了命令消息响应函数。它的形式跟Windows标准消息是一样的,不同的是ON_COMMAND宏。,标准的Windows消息的路由:直接在消息映射表中上溯,在消息映射表中查找,如果吻合就调用表中所记录的消息处理程序。命令消息的路由呢?,命令消息的路由,AfxWndProc,AfxCallWndProc,WindowProc,OnWndMsg,OnCommand,OnNotify,OnCmdMsg,视图类-文档类-框架类-应用类,添加2个菜单,ID值分别为IDM_UNDO和IDM_DELETE_ALL,分别用来删除最后画的一条直线和窗口中所有的直线。,(1)为视图类添加对这2个菜单项的消息响应(2)OnUndo()intnUpperBound=m_ptrArray.GetUpperBound();if(nUpperBoundInsertMenu(2,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,“测试);在这个弹出菜单中添加菜单项。menu.AppendMenu(MF_STRING,111,Hello);menu.AppendMenu(MF_STRING,112,“Welcome);如果想在File菜单的末尾添加一个菜单项GetMenu()-GetSubMenu(0)-AppendMenu(MF_STRING,113,“Sing);,在框架窗口创建之后动态删除菜单,如果想删除编辑这个子菜单。可用DeleteMenu删除弹出菜单或菜单项。具体删除的是哪个,取决于是谁调用DeleteMenu函数,如果是菜单栏的指针调用该函数,则删除弹出菜单,如果是子菜单的指针去调用,则删除菜单项。GetMenu()-DeleteMenu(1,MF_BYPOSITION);删除File中的打开,可以这样GetMenu()-GetSubMenu(0)-DeleteMenu(2,MF_BYPOSITION);先获取子菜单的指针,可以通过索引去找,也可以通过命令ID去寻找。,对插入的菜单项Hello进行菜单的响应,动态创建的菜单如何去添加添加菜单消息响应函数,当然手动去添加。我们借助ClassWizard为一个类去添加一个菜单响应的命令消息的方法,然后照猫画虎去填写。(1)在头文件中声明函数原型。afx_msgvoidOnHello();(2)对于命令消息,用ONCOMMAND宏来响应的。在源文件中ON_COMMAND(111,OnHello)(3)函数本身,在源文件中voidCMainFrame:OnHello()MessageBox(Hello!);,如何在非框架类中对菜单进行操作,由于菜单栏是框架窗口的一部分,由框架窗口来管理,在别的类中要对菜单进行操作,首先要得到框架。AfxGetMainWnd()-GetMenu();或AfxGetApp()-m_pMainWnd-GetMenu();,
展开阅读全文