• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            road420

            導(dǎo)航

            <2008年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            讓對(duì)話框?qū)PDATE_COMMAND_UI生效

             問題:一般情況下我們用UPDATE_COMMAND_UI來修改菜單的狀態(tài)(enable/disable, check/uncheck, change text),但這個(gè)方法在一個(gè)基于對(duì)話框上的菜單卻沒有效果。
            void CTestDlg::OnUpdateFileExit(CCmdUI* pCmdUI)
            {
                 pCmdUI->Enable(FALSE);
                 pCmdUI->SetCheck(TRUE);
                 pCmdUI->SetRadio(TRUE);
                 pCmdUI->SetText("Close");
            //以上方法在MDI、SDI程序中都能起作用,在對(duì)話框中卻沒有效果,根本沒有調(diào)用這個(gè)函數(shù)。
            }
             
            原因分析:當(dāng)顯示一個(gè)下拉的菜單的時(shí)候,在顯示菜單前會(huì)發(fā)送WM_INITMENUPOPUP消息。而CFrameWnd::OnInitMenuPopup函數(shù)會(huì)刷新這個(gè)菜單項(xiàng),同時(shí)如果有UPDATE_COMMAND_UI響應(yīng)函數(shù),則調(diào)用它。通過它來更新反應(yīng)每個(gè)菜單的外觀效果(enabled/disabled, checked/unchecked).
            在一個(gè)基于對(duì)話框的程序中,因?yàn)闆]有OnInitMenuPopup函數(shù),所以不會(huì)調(diào)用UPDATE_COMMAND_UI響應(yīng)函數(shù),而是使用了CWnd類的默認(rèn)處理, 這種處理沒有調(diào)用UPDATE_COMMAND_UI響應(yīng)函數(shù)。

            解決方法如下:
            第一步:
            在對(duì)話框類的.cpp文件,添加一個(gè)ON_WM_INITMENUPOPUP入口到消息映射里面
            BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
            //}}AFX_MSG_MAP
            ON_WM_INITMENUPOPUP()
            END_MESSAGE_MAP()
            第二步:
            在對(duì)話框類的.h文件添加消息函數(shù)聲明。
            // Generated message map functions
            //{{AFX_MSG(CDisableDlgMenuDlg)
            afx_msg void OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu);
            //}}AFX_MSG
            DECLARE_MESSAGE_MAP()
            第三步:
            在對(duì)話框類的.cpp文件添加如下函數(shù)代碼(大部分代碼取自WinFrm.cpp文件的函數(shù)CFrameWnd::OnInitMenuPopup):
            void C******Dlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
            {
                 ASSERT(pPopupMenu != NULL);
                // Check the enabled state of various menu items.

                CCmdUI state;
                state.m_pMenu = pPopupMenu;
                ASSERT(state.m_pOther == NULL);
                ASSERT(state.m_pParentMenu == NULL);

                // Determine if menu is popup in top-level menu and set m_pOther to
                // it if so (m_pParentMenu == NULL indicates that it is secondary popup).
                HMENU hParentMenu;
                if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
                     state.m_pParentMenu = pPopupMenu;??? // Parent == child for tracking popup.
               else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
               {
                   CWnd* pParent = this;
                   // Child windows don't have menus--need to go to the top!
                   if (pParent != NULL &&
            (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
                  {
                       int nIndexMax = ::GetMenuItemCount(hParentMenu);
                      for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
                     {
                         if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
                         {
                            // When popup is found, m_pParentMenu is containing menu.
                            state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
                            break;
                         }
                     }
                }
            }

              state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
              for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
              state.m_nIndex++)
              {
                  state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
                  if (state.m_nID == 0)
                      continue; // Menu separator or invalid cmd - ignore it.

                  ASSERT(state.m_pOther == NULL);
                  ASSERT(state.m_pMenu != NULL);
                  if (state.m_nID == (UINT)-1)
                  {
                      // Possibly a popup menu, route to first item of that popup.
                      state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
                      if (state.m_pSubMenu == NULL ||
             (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
            state.m_nID == (UINT)-1)
                   {
                          continue;    // First item of popup can't be routed to.
                   }
                   state.DoUpdate(this, TRUE);?? // Popups are never auto disabled.
                  }
                  else
                 {
                      // Normal menu item.
                      // Auto enable/disable if frame window has m_bAutoMenuEnable
                      // set and command is _not_ a system command.
                     state.m_pSubMenu = NULL;
                     state.DoUpdate(this, FALSE);
                  }

                  // Adjust for menu deletions and additions.
                  UINT nCount = pPopupMenu->GetMenuItemCount();
                  if (nCount < state.m_nIndexMax)
                    {
                               state.m_nIndex -= (state.m_nIndexMax - nCount);
                               while (state.m_nIndex < nCount &&
                              pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
                       {
                        state.m_nIndex++;
                        }
                   }
                    state.m_nIndexMax = nCount;
               }
            }

            posted on 2008-07-17 11:42 深邃者 閱讀(203) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            欧美精品一本久久男人的天堂| 午夜视频久久久久一区| 久久久久人妻精品一区三寸蜜桃| 久久伊人精品青青草原高清| 久久精品国产半推半就| 婷婷久久综合九色综合九七| 伊人久久亚洲综合影院| 精品久久一区二区三区| 久久99精品九九九久久婷婷| 色婷婷综合久久久久中文| 国产精品热久久毛片| 久久天天躁狠狠躁夜夜网站| 久久国产乱子伦精品免费强| 久久婷婷人人澡人人| 99久久精品免费| 91精品国产高清久久久久久io | 久久精品国产亚洲AV麻豆网站 | 久久久久亚洲av无码专区| 久久综合九色综合久99| 久久精品国产亚洲AV忘忧草18| 狠狠干狠狠久久| 欧美亚洲国产精品久久高清| 久久久精品人妻无码专区不卡| 日韩精品久久久肉伦网站| 久久精品国产一区二区三区不卡| 国内精品久久久久影院优| 无码人妻久久久一区二区三区 | 色婷婷噜噜久久国产精品12p| 久久综合九色综合精品| 奇米影视7777久久精品| 欧美日韩精品久久久免费观看| 久久久久免费视频| 久久国产成人午夜aⅴ影院 | 天天躁日日躁狠狠久久| 久久AV高潮AV无码AV| 久久综合亚洲色HEZYO国产| 久久97久久97精品免视看| 91精品国产91热久久久久福利 | 欧美大战日韩91综合一区婷婷久久青草 | 久久不见久久见免费视频7| 77777亚洲午夜久久多人|