消息分类:
命令消息:
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
通告消息:
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。
标准消息:
除WM_COMMAND之外,所有以WM_开头的消息。
从CWnd派生的类,都可以接收到这类消息。(CWnd从CCmdTarget类派生出来,所以也可以接收以上两者消息)
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);
// //1.设置标记菜单项
// //GetMenu()->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED); //通过索引找到“新建”按钮
// GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_CHECKED);//通过ID找到“新建”按钮
// //2.设置缺省菜单项
// //只能设置一个,以索引方式定位菜单项时注意算上分隔符
// //GetMenu()->GetSubMenu(0)->SetDefaultItem(1,true);//将文件子菜单下的第2项打开设置为缺省菜单项
// GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN, false);
// //3.设置位图标记菜单项
// //首先为MainFramek类添加一个位图私有变量,并创建一个位图资源
// //获得位图资源的像素大小,目的是合理为合理创建位图资源
// CString str;
// str.Format("x = %d, y = %d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
// MessageBox(str);
// //开始设置
// bitmap.LoadBitmap(IDB_BITMAP1);
// GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&bitmap, &bitmap);
// //4.使菜单项(文件->打开)不能使用
// //必须在MainFrame的构造函数中设置m_bAutoMenuEnble = false
// GetMenu()->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
// //5.去掉默认的菜单
// SetMenu(NULL);
// CMenu menu;
// menu.LoadMenu(IDR_MAINFRAME); //加载一个新菜单,可以自己创建
// SetMenu(&menu);
// // HMENU hmenu = GetMenu()->GetSafeHmenu();
// // hmenu = menu.Detach();
// menu.Detach(); //将窗口菜单从菜单对象中分离出来,返回菜单对象句柄
// //防止局部变量menu生命周期结束时出错(否则打印预览之后会出错
return 0;
}
void CMainFrame::OnUpdateFilePrint(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (ID_FILE_PRINT == pCmdUI->m_nID) //此时菜单和工具栏中的打印都不可用
//if(5 == pCmdUI->m_nIndex) //此时只有菜单项中的打印不可用,原因是两者的索引方式不同
//if(8 == pCmdUI->m_nIndex) //此时只有工具栏的打印不可用
pCmdUI->Enable(FALSE); //是编辑菜单下的剪切菜单项可以使用
}
//手动创建右键菜单
void CMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pPopup = menu.GetSubMenu(0);
CRect rect;
GetClientRect(&rect);
ClientToScreen(&rect);
point = point+rect.TopLeft();
// ClientToScreen(&point);
// point.Offset(10,5);
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
//弹出菜单的拥有者为this即只有view类才可以捕获弹出菜单的命令消息。
//若将this改为GetParent(),那么Mainframe类可以捕获view类不捕获的消息。