1. 程式人生 > >CContextMenuManager上下文選單管理器以及為選單新增圖示

CContextMenuManager上下文選單管理器以及為選單新增圖示

               

在Visual Studio 2008SP1中,要彈出上下文關聯選單的話,只需要在應用程式初始化的時候呼叫CWinAppEx::InitContextMenuManager,然後使用CWinAppEx::GetContextMenuManager獲得一個指向應用程式的上下文管理器。如果工程是單文件/多文件的話,可能會自動關聯一個右鍵選單,可以在應用程式的實現檔案看到類似如下程式碼:

// CXXXApp 自定義載入/儲存方法 void CXXXApp::PreLoadState() {     BOOL bNameValid;     CString strName;     bNameValid = strName.LoadString(IDS_EDIT_MENU);     ASSERT(bNameValid);     GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT); } 

要彈出選單的時候,只需要呼叫ShowPopupMenu即可。如下類似:

BOOL CXXXForEdit::PreTranslateMessage(MSG* pMsg) {         if   ((pMsg->message   ==   WM_RBUTTONDOWN))       {         CPoint point(pMsg->pt);                 theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);         return   TRUE;      }     else
           return CXXXForEdit::PreTranslateMessage(pMsg); } 

如果是要彈出另一個選單資源ID的話,需要先在CXXXApp::PreLoadState()裡面新增快捷選單,如下:

void CXXXApp::PreLoadState() {     BOOL bNameValid;     CString strName;     bNameValid = strName.LoadString(IDS_EDIT_MENU);     ASSERT(bNameValid);     GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT);     GetContextMenuManager()->AddMenu(_T("專門編輯"
), IDR_POPUP_FOREDIT); } 

這時,才能使用下面語句呼叫:

theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_FOREDIT, point.x, point.y, this, TRUE); 

要為選單新增圖示的話,要使用到CMFCToolBar::AddToolBarForImageCollection ()函式,其函式原型如下:

static BOOL __stdcall AddToolBarForImageCollection(    UINT uiResID,    //Resource ID of a toolbar with images to load.    UINT uiBmpResID=0,    //Resource ID of a bitmap with toolbar images.    UINT uiColdResID=0,    //Resource ID of a bitmap with "cold" toolbar images.    UINT uiMenuResID=0,    //Resource ID of a bitmap with menu images.    UINT uiDisabledResID=0,//Resource ID of a bitmap with disabled toolbar images.    UINT uiMenuDisabledResID=0 //Resource ID of a bitmap with disabled menu images. ); 

在資源檢視ToolBar插入一個ToolBar,然後建立四個工具欄物件,如下圖所示:

接著四個工具欄物件的ID號要跟需要繫結到選單項圖示的ID號一致,且順序一致。接著把預先準備好的工具欄影象點陣圖BMP,載入到資源視圖裡面,修改其ID為IDB_POPUP_BITMAP,如下圖所示:

然後,在初始化函式OnInitialUpdate()下新增入下程式碼:

CMFCToolBar::AddToolBarForImageCollection (IDR_TOOLBAR1,IDB_POPUP_BITMAP); 

執行程式就可以看到效果了,但是此時還是灰色狀態,為選單項“新增事件處理程式”,結果如下圖所示: