新建好一個單文檔工程,頂層菜單也在同時建好,在resource view中可以看到,頂層菜單的menu的ID爲IDR_MAINFRAME,打開IDR_MAINFRAME,如圖,怎麼獲取菜單下透明度中的子菜單項?(如:1.0,0.8...)
而且還存在另一個問題就是這幾個子菜單都是等價的,理想狀態是點擊任意一個菜單項都會響應同一個函數,傳統的方法,假如右鍵添加消息響應函數,需要寫5個完全一樣的函數,影響代碼效率與規範。這裏就需要設定響應命令範圍了,用到的方法是使用MFC 的 ON_COMMAND_RANGE宏。它將一組連續的命令ID映射爲一個公用處理程序。
所以,需要在消息映射中添加如下代碼:
BEGIN_MESSAGE_MAP(CxxView, CView)
ON_COMMAND_RANGE(ID_32776,ID_32780,&CxxView::ONSetOpacityValue)
END_MESSAGE_MAP()
我的菜單中共有五個透明度的值,它們的ID號依次是ID_32776到ID_32780. ONSetOpacityValue是需要響應的消息函數,所以在這個函數中添加代碼即可。
void CxxView::ONSetOpacityValue(UINT uID)
{
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
C3DStomachView *p3DStomachView=(C3DStomachView *)pMain->Get3DStomachView();//最主要的是以下五行代碼
CMenu *pMenu = new CMenu();
pMenu->LoadMenuA(IDR_MAINFRAME);
CMenu *pSubMenu = pMenu->GetSubMenu(5)->GetSubMenu(1);
CString strTemp;
pSubMenu->GetMenuString(uID-ID_32776,strTemp,MF_BYPOSITION);
p3DStomachView->m_f3DModelOpacity = _tstof(strTemp);
}
這樣的話,我點擊的菜單項的文本就保存在了strTemp,中去了,然後用_tstof()將Cstring類型轉成Float類型