<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    懵懵燈燈的BLOG

    寒夜孤燈點點星

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      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菜單項??

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

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

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

    ?


    posted on 2008-01-09 21:54 懵懵燈燈 閱讀(3039) 評論(0)  編輯  收藏 所屬分類: MFC
    主站蜘蛛池模板: 免费专区丝袜脚调教视频| 水蜜桃视频在线观看免费播放高清| 午夜精品免费在线观看| 亚洲日韩国产精品第一页一区| 一本一道dvd在线观看免费视频| 韩国欧洲一级毛片免费| 亚洲AV无码成人精品区狼人影院| 精品国产麻豆免费网站| 高h视频在线免费观看| 免费二级毛片免费完整视频| 免费中文字幕视频| 国产成人A亚洲精V品无码 | 亚洲日韩AV无码一区二区三区人| 四虎精品视频在线永久免费观看| 亚洲精彩视频在线观看| 久久天天躁狠狠躁夜夜免费观看| 亚洲第一男人天堂| 国产在线98福利播放视频免费| 污污污视频在线免费观看| 国产亚洲美女精品久久久久狼| 亚洲欧洲免费视频| 亚洲白色白色永久观看| 女人18特级一级毛片免费视频| 亚洲AV综合永久无码精品天堂| 亚洲精品成人在线| 国产精品99精品久久免费| 亚洲最大成人网色| 德国女人一级毛片免费| 一级毛片在线免费视频| 久久99国产亚洲精品观看| 啦啦啦高清视频在线观看免费 | 亚洲gv白嫩小受在线观看| 一个人免费观看www视频在线| 无码天堂va亚洲va在线va| 国产亚洲A∨片在线观看| 国产成人精品免费视频动漫 | 16女性下面无遮挡免费| 亚洲av无码专区在线观看下载| 亚洲精品国产va在线观看蜜芽| 最近免费mv在线观看动漫 | 无码的免费不卡毛片视频|