お世話になっております。
ポップアップメニューの項目にチェック状態を設定しているのですが、うまく記憶させる(次回開くときに反映されている)方法がわかりません。どんな処理が不足しているのかご教示いただけますと幸いです。
C++
1void COcxCtrl::OnRButtonDown(UINT nFlags, CPoint point) 2{ 3 HMENU hmenu = ::LoadMenu((HINSTANCE)::GetWindowLong(this->GetSafeHwnd(), GWL_HINSTANCE), MAKEINTRESOURCE(IDR_MENU1)); 4 HMENU hmenuPopup = ::GetSubMenu(hmenu, 0); 5 6 ::ClientToScreen(this->GetSafeHwnd(), &point); 7 ::TrackPopupMenu(hmenuPopup, TPM_LEFTALIGN, point.x, point.y, 0, this->GetSafeHwnd(), NULL); 8 ::DestroyMenu(hmenu); 9 10 COleControl::OnRButtonDown(nFlags, point); 11} 12 13/// m_checked は、BOOL型のCOcxCtrlメンバー変数 14 15void COcxCtrl::OnPopupCheck() 16{ 17 HMENU hmenu = ::LoadMenu((HINSTANCE)::GetWindowLong(this->GetSafeHwnd(), GWL_HINSTANCE), MAKEINTRESOURCE(IDR_MENU1)); 18 HMENU hmenuPopup = ::GetSubMenu(hmenu, 0); 19 20 UINT state = ::GetMenuState(hmenu, IDM_POPUP_CHECK, MF_BYCOMMAND); 21 ASSERT(state != 0xFFFFFFFF); 22 if (state & MF_CHECKED){ 23 m_checked = false; 24 MessageBox(_T("F")); 25 } 26 else{ 27 m_checked = true; 28 MessageBox(_T("T")); 29 } 30 31 ::CheckMenuItem(hmenu, IDM_POPUP_CHECK, MF_BYCOMMAND | (m_checked ? (MF_CHECKED) : (MF_UNCHECKED))); 32}
常にチェックが入り(メッセージボックスでは F が毎度表示)、MF_UNCHECKEDを設定しているにもかかわらず、次回開くときにチェックが入っています。プログラミングの間違いで論理が変なのかと思い、上記コードのMF_CHECKEDをMF_UNCHECKEDにしてもチェックはついたまま。プロパティでCheckedをFalseに指定すると、今度は何をしてもチェックは入りません。
だいぶ以前にしたときには出来たのですが、コードはすっかり忘れてしまい、何がおかしいのか思い当たらず困ってしまいました。
何かご指摘いただけますと助かります。
追記
該当メニュー項目プロパティのCheckedをFalseにすると、::CheckMenuItem() の戻り値は 0 です。
>::CheckMenuItem(hmenu, ...
を
>::CheckMenuItem(hmenuPopup, ...
としてみましたが、同じでした。
再追記
GetMenuItemInfoやSetMenuItemInfoを利用しても、変化ありませんでした(エラーにもなりません)
C++
1void COcxCtrl::OnPopupCheck() 2{ 3 HMENU hmenu = ::LoadMenu((HINSTANCE)::GetWindowLong(this->GetSafeHwnd(), GWL_HINSTANCE), MAKEINTRESOURCE(IDR_MENU1)); 4 HMENU hmenuPopup = ::GetSubMenu(hmenu, 0); 5 6 MENUITEMINFO menuItemInfo; 7 ::ZeroMemory(&menuItemInfo, sizeof(menuItemInfo)); 8 menuItemInfo.cbSize = sizeof(menuItemInfo); 9 menuItemInfo.fMask = MIIM_STATE; 10 11 DWORD d = ::GetMenuItemInfo(hmenu, IDM_POPUP_CHECK, false, &menuItemInfo); 12 DWORD e = ::GetLastError(); 13 14 menuItemInfo.fMask = MIIM_STATE; 15 menuItemInfo.fState |= MF_CHECKED; 16 17 DWORD dw = ::SetMenuItemInfo(hmenu, IDM_POPUP_CHECK, false, &menuItemInfo); 18 DWORD ee = ::GetLastError(); 19}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。