MFC笔记之菜单相关操作

标记菜单:GetMenu( )->GetSubMenu( 0 )->CheckMenuItem( 0, MF_BYPOSITION | MF_CHECKED);

设置默认菜单:GetMenu( )->GetSubMenu( 0 )->SetDefaultItem(1, TRUE); //第二个参数为true,则用index索引,为false则用菜单ID索引

菜单中的图形标记:GetMenu( )->GetSubMenu( 2 )->SetMenuItemBitmaps( 2, MF_BYPOSITION, &m_bitmap, &m_bitmap);
禁用菜单:GetMenu( )->GetSubMenu( 2 )->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);//需要在CMainFrame的构造函数中将m_bAutoMenuEnable设置为FALSE

移除菜单:SetMenu( NULL )

装载菜单:在编程中,出了使用MFC自动穿件的IDR——MAINFRAME菜单意外,还可以自己创建一个菜单资源,并加载,然后调用SetMenu函数,从而使程序的菜单变成自己定义的这个菜单。通过这种方式,可以实现动态更换程序菜单的功能。

CMenu menu;

menu.LoadMenu( IDR_MAINFRAME );

SetMenu( &MENU);

menu.Detach(); //句柄于对象分离,这样在局部菜单对象的生命周期结束时,它不会去销毁一个它不再具有控制权的菜单。

只做一点简单的笔记,刚用msdn查了一下,N多成员函数。好吧,windows下的任何开发都离不开msdn,msdn才是最好的老师。

利用MFC编程时,菜单项的状态的维护依赖于CN_UPDATE_COMMAND_UI (user interface ),即只需要捕获UPDATE_COMMAND_UI消息,在该消息响应函数中调用CCmdUI对象的相应函数,就可以分别实现使菜单项可用、禁用、设置标记菜单,或者设置菜单项的文本等功能。

CCmdUI确实好用,操作也比较简单,如图:


MFC笔记之菜单相关操作

动态修改,创建菜单:


CMenu menu;
menu.CreateMenu();
//GetMenu()->AppendMenu( MF_POPUP, (UINT)menu.m_hMenu, "Test");
GetMenu()->InsertMenu(2, MF_POPUP | MF_BYPOSITION , (UINT)menu.m_hMenu, "Test");

menu.AppendMenu( MF_STRING , 111, "HELLO");
menu.AppendMenu( MF_STRING , 112, "Bye");
menu.AppendMenu( MF_STRING , 113, "Mybole");
GetMenu()->GetSubMenu(0)->InsertMenu( ID_FILE_OPEN, MF_BYCOMMAND | MF_STRING, 115, "VC编程");
menu.DeleteMenu( 1, MF_BYPOSITION);
menu.Detach();

对于动态创建的菜单,其响应函数也需要手动添加。