懵懵燈燈的BLOG

          寒夜孤燈點點星

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            56 隨筆 :: 10 文章 :: 22 評論 :: 0 Trackbacks

          ---------------------------------

          1. Programmatically Example

          ?
          // The code fragment below shows how to disable (and gray out) the 
          // File\New menu item.
          // NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of 
          // CMainFrame so no ON_UPDATE_COMMAND_UI or ON_COMMAND handlers are 
          // needed, and CMenu::EnableMenuItem() will work as expected.
          
          CMenu* mmenu = GetMenu();
          CMenu* submenu = mmenu->GetSubMenu(0);
          submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
          2. Message Processing Appoach


          原貼地址:http://www.winu.cn/thread-52578-1-1.html

          如何enable/disable菜單項??

          ? ? 這個問題在以前的知識庫中出現過多次,許多人問及在MFC應用程序中enable或disable菜單的問題,在主菜單中調用 CMenu::EnableMenuItem不起作用......如何disable菜單項???
          ? ? 根據以往的經驗,要解決這種問題,似乎應該有一個象EnableMenuItem之類的API函數,它的功能就是enable或disable菜單項。Windows中確實有這樣的函數-但不是在MFC的應用中。實際上,在MFC里enable或disable菜單項是通過使用ON_ UPDATE_COMMAND_UI實現的。首先讓我解釋一下為什么MFC的實現方法不同于標準的C和Windows API,以及MFC的實現方法的好處。??
          ? ? 一般情況下,用戶界面的狀態指的是按鈕,狀態格,菜單項等任何反映程序狀態的東西。例如,如果程序處于只讀模式,那么編輯(Edit)命令應該是disable的,并且在程序的某個地方可能有一個小指示器向用戶提示這個狀態。另一個例子是如果剪貼板沒有內容(一種狀態),那么菜單中的粘貼(Paste)命令應該是disable的。所以說通常的用戶界面(UI)指的就是程序表現的狀態,同時,程序狀態的改變應該在程序的菜單中反映出來。??
          如何隨時獲得反映程序狀態的用戶界面呢?我自己的方法有兩種:??
          ? ? 第一種是神經過敏型,也就是說無論何時只要程序狀態改變,都不要忘記同時更新用戶界面,如果用戶調用只讀模式命令,這個命令要disable所由編輯控制。同樣,如果用戶調用Cut或者Copy,處理器立刻enable Paste命令。在程序的任何地方對程序狀態的任何改變,都必須要更新相應的UI。??
          ? ? 第二種方法是放松型,也就是說,不要試圖去維護所有的狀態信息,只根據需要更新用戶界面。對于菜單來說,不用保持菜單的狀態的更新,只在顯示的時候進行更新。
          ? ? 這個方法較容易,也十分簡單。更重要的是,它使數據從用戶界面中分離出來。每個對象只存儲它自己的狀態-例如,文檔知道什么時候處于只讀模式。UI能解釋出現的各種狀態,你不想低級對象調用類似EnableMenu的UI函數!MFC提供一個UI更新機制來實現后一種方法,詳細的方法描述因為內容太多,將在另文中討論,其基本思路是這樣的:當用戶調用一個菜單的時候,Windows發送一個WM_INITMENUPOPUP消息。MFC創建一個暫時的CCmdUI對象處理這個消息,為每一個菜單項做連續初始化并將它傳遞到應用程序中的對象。MFC為此調用ON_UPDATE_COMMAND_UI消息處理器更新用戶界面:??
          ON_UPDATE_COMMAND_UI(ID_FOO, OnUpdateFoo)??
          ? ? 只要用戶進入包含Foo的菜單項,MFC就會調用OnUpdateFoo函數。你不必擔心必須調用::EnableMenuItem(第一種方法)的所有地方;要做的只是從程序狀態確定菜單狀態。典型的處理方法如下:??
          void CMainFrame::OnUpdateFoo(CCmdUI* pCmdUI)
          {
          ? ???pCmdUI->Enable(pObj->GetFoo());
          }

          ? ? GetFoo()是個假設的函數,它獲得某個對象的foo狀態-例如,m_pDocument->GetReadOnly()。可能有20函數來修改foo狀態(自然是通過方法SetFoo),但更新菜單的地方只有一處。當然有可能是更復雜的情形,如:??
          pCmdUI->Enable(m_bFoo &&
          ? ? (GetStatusX(...) || GetStatusY(...)));

          ? ? 在Paste菜單的情形中,你必須檢查剪貼板是否有粘貼的內容,內容有可能是文本或圖形,這里關鍵是在需要的時候決定菜單的狀態,菜單更新代碼被單獨放在一個函數中-遠離潛在的對象-替代了遍及所有對象的灑水式EnableMenuItem調用。??
          ? ? MFC使用CCmdUI和ON_UPDATE_COMMAND_UI來調整按鈕、狀態條窗格和菜單項的狀態,并且你可以自己擴展其它的UI項目。例如,當用戶點擊下拉箭頭時,你可以根據程序的狀態調整組合框或列表框的內容。CCmdUI::Enable是個虛擬函數,在對于菜單項的操作當中,它變成了::EnableMenuItem。??
          ? ? 在前面的例子中,我們討論的UI處理是在CMainFrame中實現的,但你也能將這種處理放在框架,視圖,文檔,應用(派生于CWinApp)或任何其它類中,命令通過CCmdTarget::OnCmdMsg發送。如果MFC找不到特定菜單的ON_UPDATE_COMMAND_UI,它用以下的規則自動做enable或disable:??
          ? ? 如果命令有一個處理器(ON_COMMAND),MFC enable菜單項;否則,MFC disable菜單項。你可以設置CFrameWnd::m_bAutoMenuEnable = FALSE重載這個行為,這樣的話,所有菜單項都將被enable-不管有沒有處理器。??
          ? ? 所以,在MFC應用程序中,不要用EnableMenuItem來enable或disable菜單,而要使用ON_UPDATE_COMMAND_UI處理器來實現菜單的enable或disable。??

          ?


          posted on 2008-01-09 21:54 懵懵燈燈 閱讀(3040) 評論(0)  編輯  收藏 所屬分類: MFC
          主站蜘蛛池模板: 星子县| 江津市| 武鸣县| 武穴市| 璧山县| 怀仁县| 即墨市| 吐鲁番市| 阳西县| 扶余县| 夹江县| 绥棱县| 获嘉县| 襄樊市| 祁门县| 栖霞市| 嘉荫县| 成安县| 临洮县| 田东县| 宝山区| 长沙市| 桐乡市| 湟源县| 信宜市| 吉林省| 安泽县| 当阳市| 泊头市| 钟山县| 安西县| 苍南县| 黄龙县| 通州市| 惠来县| 丰都县| 泸水县| 洮南市| 启东市| 沈阳市| 赞皇县|