?? sy0102.htm
字號:
<html>
<HEAD>
<TITLE>Visual C++與計算機接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<font color="#0000FF">更新命令用戶接口(UI)消息</font>
<p>
(一)實驗目的:<BR>
練習如何控制菜單的顯示形態<BR><BR>
(二)實驗內容:<BR>
將菜單使能或選中<BR><BR>
(三)實驗方法:<BR><BR>
一般情況下,菜單項和工具條按鈕都不止一種狀態,我們經常需要根據應用的內部狀態來對菜單項和工具條按鈕作相應的改變。<BR>
例如,在我們沒有選擇任何內容時,編輯菜單下的“復制”、“剪切”等菜單是無效的(灰色顯示)。有時還可看到,在菜單項旁邊可能還會有檢查標記,表示它是選中的還是不選中的。工具條也有類似的情形,如果按鈕不可用也可以被置成無效,或者可以被選中。<BR>
如果我們采用SDK來編程,那么我們就要跟蹤與這些狀態相關的變量所有可能發生變化的地方,并根據可能發生的變化作相應的處理。這樣的工作非常復雜且容易遺漏。為此,MFC應用程序框架引入了更新命令用戶接口消息來簡化這一工作。<BR><BR>
在ClassWizard的Message Map頁中,如果我們選擇一個菜單ID,在Messages列表框中就會出現兩項:<BR>
COMMAND<BR>
UPDATE_COMMAND_UI<BR>
其中UPDATE_COMMAND_UI就是更新命令用戶接口消息,專門用于處理菜單項和工具條按鈕的更新。<BR>
每一個菜單命令都對應于一個更新命令用戶接口消息。可以為更新命令用戶接口消息編寫消息處理函數來處理用戶接口(包括菜單和工具條按鈕)的更新。<BR>
如果一條命令有多個用戶接口對象(比如一個菜單項和一個工具條按鈕),兩者都被發送給同一個處理函數。這樣,對于所有等價的用戶接口對象來說,可以把用戶接口更新代碼封裝在同一地方。<BR>
<H4>用戶接口更新原理</H4>
為了理解用戶接口更新機制,我們來看一下應用框架是如何實現用戶接口更新的。<BR>
當我們選擇某一菜單時,將產生一條WM_INITMENUPOPUP消息。框架的更新機制將在菜單拉下之前集體更新所有的項,然后再顯示該菜單。<BR>
為了更新所有的菜單項,應用框架按標準的命令發送路線把該彈出式菜單中的所有菜單項的更新命令都發送出去。通過匹配命令和適當的消息映射條目(形式為ON_UPDATE_COMMAND_UI),并調用相應的更新處理器函數,就可以更新任何菜單項。<BR>
如果在命令發送期間找不到對應于該命令的ON_UPDATE_COMMAND_UI項,那么框架就檢查是否存在一個命令的ON_COMMAND項,如果存在,則使該菜單有效,否則就使該菜單無效(灰化)。<BR>
這種更新機制僅適用于彈出式菜單,對于頂層菜單象File和Edit菜單,就不能使用這種更新機制。<BR>
按鈕的命令更新機制與菜單的命令接口更新機制類似,只是工具條按鈕的命令接口更新在空閑循環時完成。<BR>
<H4>用戶接口更新機制編程</H4>
當框架給處理函數發送更新命令時,它給處理函數傳遞一個指向CCmdUI對象的指針。這個對象包含了相應的菜單項或工具條按鈕的指針。更新處理函數利用該指針調用菜單項或工具條的命令接口函數來更新用戶接口對象(包括灰化,使能,選中菜單項和工具條按鈕等)。<BR><BR>
下面使用前面的例子演示如何使用用戶接口更新機制:<BR>
(1)按Ctrl+W激活ClassWizard,選擇Message Map選項頁。<BR>
(2)在Object IDs列表中選擇 ID_MSG1,在Messages列表中雙擊ON_UPDATE _COMMAND_UI條目,彈出Add Member Function對話框。<BR>
(3)接受缺省函數名,按OK按鈕接收此函數名。OnUpdateMsg1成員函數名就出現在Member Functions列表中。<BR>
(4)在CTestMsgView類頭文件中對m_bMessage1等變量進行聲明:<BR>
向TestMsgView.h中的CTestMsgView類中加入BOOL m_bMessage1,m_bMessage2,m_bMessage3;<BR>
(5)現在手工編輯剛才生成的成員函數(TestMsgView.cpp中)<BR>
void CTestMsgView::OnMsg1() <BR>
{<BR>
// TODO: Add your command handler code here<BR>
m_bMessage1=TRUE;<BR>
m_bMessage2=FALSE;<BR>
m_bMessage3=FALSE;<BR>
}<BR>
void CTestMsgView::OnUpdateMsg1(CCmdUI* pCmdUI) <BR>
{<BR>
// TODO: Add your command update UI handler code here<BR>
pCmdUI->SetCheck(m_bMessage1); <BR>
}<BR><BR>
上例中是使用一個變量決定了菜單的是否選中,這是進行用戶接口更新的常用方式。<BR>
CCmdUI的其他功能例如使能,換文本等請參閱MSDN幫助。<BR>
<p></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -