ダイアログのメニューの有効無効やチェックなどを設定する

MFCのDocument/Viewだと、Update Command UIメカニズムが実装されているので、OnUpdateXXX() 関数をIDEから追加するだけでメニュー項目の保守が出来るけど、Dialogには、実装されていないので、自分で実装しないといけない。
MFCのソースを覗けば、再利用可能なコードがすぐに見つかる。
簡単な見つけ方は、テストのDocoument/Viewプロジェクトを作って、OnUpdateXXX()を実装してから、ブレークポイントを置いて、その関数がどこから呼ばれるのかを呼び出し履歴から見てみればすぐに判る。

私的には、メニューが複雑になるとOnUpdateXXX()関数が乱立してコード中に散乱するのが醜いので、もっとスマートに書けない物かと。

次のようにすると、ダイアログでもメニューの保守が出来て、メニューIDごとに処理内容を決まった関数で決める事が出来る。


void CXXDlg::UpdateMenu(CMenu* pMenu)
{
       int menuCount = pMenu->GetMenuItemCount();
       for(int i=0; i<menuCount; i++)
       {
               MENUITEMINFO menuItemInfo;
               ::memset(&menuItemInfo, 0, sizeof(MENUITEMINFO));
               menuItemInfo.cbSize = sizeof(MENUITEMINFO);
               menuItemInfo.fMask = MIIM_STATE | MIIM_ID;
               if(pMenu->GetMenuItemInfo(i, &menuItemInfo, TRUE))
               {
                       if(UpdateMenuItem(&menuItemInfo))
                       {
                               pMenu->SetMenuItemInfo(i, &menuItemInfo, TRUE);
                       }
               }
       }
}

bool CXXDlg::UpdateMenuItem(MENUITEMINFO* pMenuItemInfo)
{
       bool enable = SomeFunc();
       switch(pMenuItemInfo->wID)
       {
       case ID_A:
       case ID_B:
       case ID_C:
       case ID_D:
               pMenuItemInfo->fState = enable ? MFS_ENABLED : MFS_DISABLED;
               return true;
       }
   return false;
}

void CXXDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
       UpdateMenu(pPopupMenu);
       __super::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
}

[PR]
by isoq | 2008-09-16 14:12 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< ひまわり:これつぼみ? エクセルで線形補間をするマクロ >>