1、程序的主菜单属于框架类窗口,所以应该在框架类窗口创建完成之后再去访问菜单。
2、框架类窗口创建完成的WM_CREAT消息函数OnCreat函数中对菜单进行操作。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
//设置 菜单项标记
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW, MF_BYCOMMAND|MF_CHECKED);
//取消 菜单项标记
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW, MF_BYCOMMAND|MF_UNCHECKED);
//设置图形标记菜单
static CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(ID_FILE_OPEN, MF_BYCOMMAND, &bmp, &bmp);
//可以通过以下方式获取菜单上显示的位图尺寸
// CString str;
// str.Format("x=%d, y=%d", GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK));
// MessageBox(str);
//设置 默认菜单项
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN, FALSE);
//禁用菜单项
m_bAutoMenuEnable = FALSE; //启用系统所有菜单项
GetMenu()->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION|MF_DISABLED|MF_GRAYED);
//启用菜单项
GetMenu()->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION|MF_ENABLED);
//移除当前菜单
SetMenu(NULL);
//加载一个菜单
static CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach(); //菜单句柄与菜单对象相互分离
return 0;
}