1. 程式人生 > >VS2010動態新增選單項

VS2010動態新增選單項

在VC6.0和VS2010裡面動態新增選單項是不一樣的,檢視MSDN文件可知,VS2010採用的是MFC9.0版,其中有很多新增的項具體資訊請檢視http://msdn.microsoft.com/en-us/library/ws8s10w4.aspx,本文就根據自己的測試詳細的比較一下二者的區別:

1.在VC6.0裡面動態新增一個子選單項

在CMainFrame::OnCtreate()中新增程式碼,另外要在Resource.h裡面新增#define ID_MENU_ADDMENUITEM    32773

CMainFrame::OnCtreate(){

//下面是新增的程式碼

CMenu *pMenu=AfxGetMainWnd()->GetMenu();
CMenu *pmSub=pMenu->GetSubMenu(1);
pmSub->AppendMenu(MF_STRING,ID_MENU_ADDMENUITEM,L"Add Menu &Item");

}//效果是在“Edit”選單最下面添加了一個"Add Menu Item"子項

2.在VS2010裡面新增一個子選單項:

要對CMainFrame類的OnShowPopupMenu()進行過載,另外要在Resource.h裡面新增#define IDS_EDIT_MYITEM_1    32773

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
{
    // TODO: Add your specialized code here and/or call the base class

    int iIndex = -1;
    if (!CMFCToolBar::IsCustomizeMode()&&(iIndex=pMenuPopup->GetMenuBar()->CommandToIndex(ID_EDIT_PASTE))>=0)
    {
        pMenuPopup->InsertSeparator(iIndex+1);
        pMenuPopup->InsertItem(CMFCToolBarMenuButton(IDS_EDIT_MYITEM_1,NULL,-1,_T("&MyItem 1")),iIndex+2);
    }   //使用CommandToIndex()來獲得選單項的索引,然後根據索引來確定子選單項的新增位置
    return CFrameWndEx::OnShowPopupMenu(pMenuPopup);
}//效果是在“Edit”選單最下面添加了一個分割線和一個"MyItem 1"子項

效果如圖,因為還沒有為其新增處理函式,所以呈灰色:

 

給新增的子選單項新增訊息處理函式:

在MainFrame.h裡面新增訊息處理函式宣告:

   class CMainFrame : public CFrameWnd{

//…

protected:

  afx_msg void OnEditMyItem1 ();

}

然後在MainFrame.cpp訊息對映裡面新增訊息對映項:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
     //…

    ON_COMMAND(IDS_EDIT_MYITEM_1, OnEditMyItem1)
END_MESSAGE_MAP()

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CMFCMenuBar的繼承關係:

           CWnd

                          CPane

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++