想在主視窗中使用CMFCMenuButton控制元件實作如下圖所示的選單按鈕,需要在用戶點擊“允許資料采集”選單項時獲取選單項的選中狀態,并改變check狀態,使得設定生效。

其中選單資源檔案為 IDR_MENU_STORAGE,“允許資料采集”選單項ID為 ID_MENU_ALLOW_STORAGE。
我在視窗的OnInitDialog()中實作如下代碼:
// IDR_MENU_STORAGE
CMenu* pMenuStorage = new CMenu;
if(TRUE == pMenuStorage->LoadMenu(IDR_MENU_STORAGE)) // 載入選單資源
{
m_menubtn_storage.m_hMenu = pMenuStorage->GetSubMenu(0)->GetSafeHmenu();
}else
{
TRACE("resource load failed!");
}
在按鈕回應行數中實作代碼如下:
void CATC_TestSvcDlg::OnBnClickedMfcmenubuttonDatastorage()
{
// TODO: 在此添加控制元件通知處理程式代碼
switch(m_menubtn_storage.m_nMenuResult)
{
case ID_MENU_ALLOW_STORAGE:
{
CMenu* pMenu = m_menubtn_storage.GetMenu();
if(pMenu)
{
UINT state = pMenu->GetMenuState(ID_MENU_ALLOW_STORAGE, MF_BYCOMMAND);
ASSERT(state != 0xFFFFFFFF);
if (state & MF_CHECKED)
pMenu->CheckMenuItem(ID_MENU_ALLOW_STORAGE, MF_UNCHECKED | MF_BYCOMMAND);
else
pMenu->CheckMenuItem(ID_MENU_ALLOW_STORAGE, MF_CHECKED | MF_BYCOMMAND);
}
}
break;
case ID_MENU_..........:
break;
default:
break;
}
在執行點擊“允許資料采集”選單項,獲得回應后,在程式執行到紅色代碼段時, 出現例外如圖所示:

顯示hMenu為unused
這個問題困擾很久,求大神解救
uj5u.com熱心網友回復:
感覺是在 CMenu* pMenu = m_menubtn_storage.GetMenu();這個地方出了問題,不知道有什么方法可以從CMFCMenuButton物件獲取到相應的選單物件uj5u.com熱心網友回復:
不是很懂樓主。選單check狀態,是在void CMainFrame::OnUpdateXX(CCmdUI *pCmdUI)里設定的(根據相關變數)。你直接使用這個相關變數判斷就行啦。uj5u.com熱心網友回復:
原因在你按鈕回應的代碼里面// TODO: 在此添加控制元件通知處理程式代碼
switch(m_menubtn_storage.m_nMenuResult)
{
case ID_MENU_ALLOW_STORAGE:
{
CMenu* pMenu = m_menubtn_storage.GetMenu();
if(pMenu)
CMenu* pMenu = m_menubtn_storage.GetMenu(); 就是這句,CMenu類中沒有GetMenu()這個成員函式,你這樣寫肯定是有問題的
如果你要得到主視窗你選單的指標那就用FromHandle函式,它的功能是:回傳一個指向給定Windows選單句柄的CMenu物件的指標
uj5u.com熱心網友回復:
你這樣干太復雜了,一般這樣干:直接在你選單項的點擊回應中代碼里,給對應的選單項打check就好了(打對勾有專門的函式),然后使其它的選單項disable(就是不可選,也有對應的函式)。其它的每個選單項的點擊回應代碼中都這樣做。但愿你能理解我的意思。uj5u.com熱心網友回復:
ON_UPDATE_COMMAND_UI()pCmdUI->Check(TRUE/FALSE);
uj5u.com熱心網友回復:
可能你用選單的時候,選單并不存在用一個內部變數記錄狀態, 彈出選單的時候更新狀態,判斷的時候也用內部變數
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/61011.html
標籤:界面
上一篇:VC6.0使用ATL出現的莫名奇妙錯誤(atlconv.h),注釋掉錯誤代碼也不好使
下一篇:c++mfc例子
