资源描述:
《MFC-菜单编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、菜单结构一个菜单拦可以有若干个子菜单,一个子菜单又可以有若干个菜单项等。对菜单栏的子菜单由左至右建立从0开始的索引。对特定子菜单的菜单项由上至下建立了从0开始的索引。访问子菜单和菜单项均可以通过其索引或标识(如果有标识的话)进行。右键弹出的菜单中,如果弹出菜单归属view类窗口,则菜单项只能响应view类和doc类消息点击;如果弹出菜单属于框架窗口的时候(可在TrackPopupMenu函数参数中设置),弹出菜单上的消息,在路由的时候,仍然遵循View-DOC-MainFrame-APP的响应顺序MFC中菜单项
2、消息如果利用ClassWizard来对菜单项消息分别在上述四个类中进行响应,则菜单消息传递顺序:View类--Doc类--CMainFrame类--App类。菜单消息一旦在其中一个类中响应则不再在其它类中查找响应函数截断菜单消息路由:可以在frame类中添加虚函数oncommand(wParame,)其中wPareme的低字节保存了菜单的ID,可以根据ID判断有用的消息来处理,处理完后加上returntrue;这样就截断了此ID的消息路由,其他菜单的消息路由正常菜单的相关重要函数1.CMenu*GetMenu(
3、);//得到菜单指针2.CMenu*GetSubMenu();//得到子菜单指针,也就是弹出菜单指针3.UINTCheckMenuItem();//将菜单项加上或去掉√(对号)标记a.如果第一个参数是ID号,第二个参数必须是MF_BYCOMMAND
4、MF_CHECKED的组合b.如果第一个参数是索引号,第二个参数必须是MF_BYPOSITION
5、MF_CHECKED的组合4.BOOLSetDefaultItem();//设置缺省菜单,也就是将菜单项粗体显示a.如果第一个参数是索引号,第二个参数必须是trueb.
6、如果第一个参数是ID号,第二个参数必须是false*注:一个子菜单最多只能有一个缺省菜单项5.BOOLSetMenuItemBitmaps();//设置位图标记,标记大小为13*13像素a.如果第一个参数是ID号,第二个参数必须是MF_BYCOMMANDb.如果第一个参数是索引号,第二个参数必须是MF_BYPOSITION第三个参数是没有选中时的位图;第四个参数是标记时的位图6.UINTEnableMenuItem();//使菜单项有效,无效,或变灰a.如果第一个参数是ID号,第二个参数必须是MF_BYCOMM
7、AND和有效,无效,或变灰的组合b.如果第一个参数是索引号,第二个参数必须是MF_BYPOSITION和有效,无效,或变灰的组合*注:若让此函数生效,必须在mainfrm构造函数中添加:m_bAutoMenuEnable=false;此时,其他变灰的菜单项也就恢复为不变灰状态了,会有副作用的7.BOOLSetMenu(CMenu*pMenu);//在当前窗口上设置新菜单或移除菜单。如果参数为0,则是移除菜单。自己创建菜单{CMenumenu;menu.LoadMenu(IDR_MENU1);SetMenu(&m
8、enu);menu.Detach();}8.HMENUDetach();//如果将CMenu对象设置为局部对象,使用Detach()从menu对象中分离窗口菜单句柄,从而当menu对象析构的时候窗口菜单资源不随之销毁菜单的相关操作的实现方法(在Cmainfrme中的OnCreate函数里初始化)a.添加对号标记:方法一:GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION
9、MF_CHECKED);//通过索引方法二:GetMenu()->GetSubMe
10、nu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND
11、MF_CHECKED);//通过IDb.设置缺省菜单项:每个子菜单最多只能有一个缺省菜单项方法一:GetMenu()->GetSubMenu(0)->SetDefaultItem(1,true);//通过索引方法二:GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN,false);//通过IDc.添加图形标记:方法一:通过IDCBitmapbitmap;//必须设置
12、为全局对象bitmap.LoadBitmap(IDB_BITMAP1);GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(ID_FILE_NEW,MF_BYCOMMAND,&bitmap,&bitmap);方法二:通过索引CBitmapbitmap;//必须设置为全局对象bitmap.LoadBitmap(IDB_BITMAP1);GetMenu