菜单以及与菜单相关联的操作null菜单以及与菜单相关联的操作菜单以及与菜单相关联的操作消息的分类 消息的分类 标准消息
除WM_COMMAND之外,所有以WM_开头的消息。
从CWnd派生的类,都可以接收到这类消息。
命令消息
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息
由控件产生的消息,例如,按钮的单击,列...
null菜单以及与菜单相关联的操作菜单以及与菜单相关联的操作消息的分类 消息的分类 标准消息
除WM_COMMAND之外,所有以WM_开头的消息。
从CWnd派生的类,都可以接收到这类消息。
命令消息
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息
由控件产生的消息,例如,按钮的单击,列
框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。null 一个类接收一个命令消息后,
文件做了哪些修改?
(a)在类的定义中的消息映射中添加命令消息
原
型
(b)在源文件的消息映射中用ON_COMMAND宏将菜单项的
ID号和命令消息响应函数进行关联
(c)在源文件中增加了命令消息响应函数。
它的形式跟Windows标准消息是一样的,不同的是ON_COMMAND宏。null标准的Windows消息的路由:
直接在消息映射表中上溯,在消息映射表中查找,如果吻合就调用表中所记录的消息处理程序。
命令消息的路由呢?
命令消息的路由命令消息的路由AfxWndProcAfxCallWndProcWindowProcOnWndMsgOnCommandOnNotifyOnCmdMsgnull视图类----- >文档类----->框架类----- >应用类null 添加2个菜单,ID值分别为IDM_UNDO和IDM_DELETE_ALL,分别用来删除最后画的一条直线和窗口中所有的直线。null(1)为视图类添加对这2个菜单项的消息响应
利用ClassView添加对2个菜单项的响应函数
(2)OnUndo()
{
int nUpperBound=m_ptrArray.GetUpperBound ();
if(nUpperBound<0)
return;
CLine *pline=(CLine *)(m_ptrArray.GetAt (nUpperBound ));
delete pline;
m_ptrArray.RemoveAt (nUpperBound);
Invalidate();
}null
(3) OnDeleteAll()
{
int nCount=m_ptrArray.GetSize ();
for(int i=0;i
AppendMenu
(MF_POPUP,(UINT)menu.m_hMenu,“测试");
menu.Detach();在框架窗口创建之后动态创建菜单在框架窗口创建之后动态创建菜单【注意:】
任何资源的类都有一个成员对象保存与该资源相关的资源句柄。
如果CMenu对象声明为局部变量,就要用Detch把句柄和菜单对象断开。
该函数会将菜单句柄和CMenu对象断开,这样,CMenu的一个局部对象,如果生命周期结束,析构函数并不会去销毁这个菜单。这个菜单是随着窗口的销毁才销毁。 在框架窗口创建之后动态创建菜单在框架窗口创建之后动态创建菜单例:在Edit的后面插入一个弹出菜单
GetMenu()->InsertMenu(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进行菜单的响应对插入的菜单项Hello进行菜单的响应动态创建的菜单如何去添加菜单消息响应函数,当然
手动去添加。我们借助ClassWizard为一个类去添加一个菜单响应的命令消息的方法,然后照猫画虎去填写。
(1)在头文件中声明函数原型。
afx_msg void OnHello();
(2)对于命令消息,用ONCOMMAND宏来响应的。
在源文件中ON_COMMAND(111,OnHello)
(3)函数本身,在源文件中
void CMainFrame::OnHello()
{
MessageBox("Hello!"); }如何在非框架类中对菜单进行操作如何在非框架类中对菜单进行操作 由于菜单栏是框架窗口的一部分,由框架窗口来管理,在别的类中要对菜单进行操作,首先要得到框架。
AfxGetMainWnd()->GetMenu();
或
AfxGetApp()->m_pMainWnd-> GetMenu();
本文档为【菜单以及与菜单相关联的操作】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。