- /*
- 更新UI對象
- 常規情況下,菜單和工具欄按鈕可以有多種狀態。例如,菜單不可用時可以置灰,菜單
- 正在被使用時可以設定爲選中狀態。同樣工具欄也有這些狀態。
- 誰來更新這些可變狀態項的狀態?從邏輯上講,如果一個菜單項產生了一個命令消息,
- 此消息會被文檔處理,那麼由文檔去更新可變狀態項的狀態更有意義,文檔中應該包括
- 可變狀態項的狀態信息。
- 如果一個命令對應多個UI對象,比如一個菜單項和一個工具欄項,那麼這兩處的發出的
- 命令將會被路由到同一個處理函數。這樣就會在一處爲多個同等的UI對象封裝一份
- UI更新代碼。
- 編程框架提供了一個自動更新UI對象的快捷方法,你可以選擇自己的更新方法,但框架
- 提供的方法更有效且易於使用。
- 1:更新函數何時被調用?
- 假設用戶通過鼠標點擊了“文件”菜單,此操作會產生WM_INITMENUPOPUP消息,在菜單
- 彈出之前,編程框架的更新機制會更新“文件”菜單下的所有菜單項,這樣我們就可以
- 看到各個菜單項的狀態了。
- 爲了做到這一點,編程框架會以標準的命令路由方式路由彈出菜單的所有菜單項命令。
- 在路由的過程中,通過檢查消息映射入口,命令目標有機會更新任意的菜單項及調用
- 更新函數。比如,一個菜單有六個菜單項,那個彈出之前,這六個更新命令都會被髮送
- 出去。如果存在與其相關的更新函數,則其會被更新狀態。如果沒有,編程框架會檢查
- 與命令ID相關的處理函數是否存在,並依據其更新菜單項的狀態。
- 如果在命令路由的過程中找不到相應的狀態更新項,編程框架會自動去檢查針對此命令
- ID的響應函數是否存在,如果存在則UI對象可用,如果不存在則不可用。
- 所以,爲了使一個UI對象可用,可以爲其提供一個命令響應函數或者一個UI對象更新
- 函數。二者存在一個即可。
- 禁用UI對象的默認不可用屬性是可以做到的,具體可以參照CFrameWnd的成員變量
- m_bAutoMenuEnable。
- 編程框架中的菜單初始化是自動完成的,它發生在程序接收到消息WM_INITMENUPOPUP
- 的時候。在IDLE時間內,編程框架會像查找菜單的更新函數一樣爲按鈕也查找更新函數。
- 2:宏ON_UPDATE_COMMAND_UI
- 通過屬性窗口可以自動地將UI對象的ID與其相應的更新函數聯繫起來。UI對象的更新
- 函數的原型如下:
- */
- /*
- 像所有的消息處理函數一樣,更新函數的聲明需要關鍵字afx_msg的支持
- 所像所有的更新函數一樣,它也需要一個參數,類型爲CCmdUI*
- */
- afx_msg void OnUpdateEditClearAll(CCmdUI *pCmdUI);
- /*
- 3:類CCmdUI
- 在路由更新命令的過程中,編程框架會爲更新函數提供一個CCmdUI*類型的參數,它代表
- 了產生更新命令的UI對象。更新函數會調用CCmdUI的成員函數去更新其代表的UI對象。
- 示例代碼如下:
- */
- void CMyWinApp::OnUpdateEditClearAll(CCmdUI *pCmdUI)
- {
- pCmdUI->Enable(m_bClearAllAvailable);
- }
- /*
- CCmdUI的成員函數可操作的UI對象包括:
- Menu item,菜單項
- Enables or disables
- Checks (×) or unchecks
- Checks using dot (•)
- Sets item text
- Toolbar button,工具欄項
- Enables or disables
- Selects, unselects, or indeterminate
- Same as SetCheck
- Status-bar pane,狀態欄項
- Makes text visible or invisible
- Sets pop-out or normal border
- Same as SetCheck
- Sets pane text
- Normal button in CDialogBar
- Enables or disables
- Checks or unchecks check box
- Same as SetCheck
- Sets button text
- Normal control in CDialogBar
- Enables or disables
- Sets window text
- 成員函數有下面的五人:
- ContinueRouting
- Enable
- SetCheck
- SetRadio
- SetText
- */
更新UI對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.