消息分类:
命令消息:
      来自菜单、加速键或工具栏按钮的消息。这类消息都以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类不捕获的消息。