CToolBarCtrl

CToolBarCtrl:基於mfc開發的控制項,這個控制項是基於MFC程式套用框架開發, MFC(Microsoft Foundation Classes),是一個微軟公司提供的類庫(class libraries),以C++類的形式封裝了Windows的API,並且包含一個應用程式框架,以減少應用程式開發人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控制項和組件的封裝類。MFC隱藏了很多東西,你在MFC界面上任何一個操作MFC都是通過訊息傳遞操作的。

概述

CToolBarctrl是CStandardBar的父類CToolBarCtrl的父類的父類,反正可以到cwd,,是一個視窗繼承類,在子視窗變動的時候,MFC一定會給視窗發出一些訊息,其中包括調用OnChildNotify的訊息,能進入到這個接口的訊息也很多WM_NOTIFY只是其中一個, 默認情況下,OnChildNotify他只處理正常的界面調整功能,你不重載的話,他就實現 CToolBarCtrl::OnChildNotify(message, wParam, lParam, pLRESULT); 所實現的程式功能, 而你重載了,他每次到這個訊息,先執行你需要的操作,再執行系統操作,也就是重載在運行時被你控制過了。
CToolBarCtrl的構造:

CObject CCmdTarget CWnd └CToolBarCtrl
CToolBarCtrl類提供了Windows工具條通用控制項的性能。這個控制項(也就是CToolBarCtrl類)只對運行在Windows 95和Windows NT 3.51或更高版本下的程式來說才是可用的。
一個Windows工具條通用控制項是一個矩形子視窗,它包含一個或多個按鈕。這些按鈕可以顯示一個點陣圖圖像,一個字元串,或兩者都有。當用戶選擇一個按鈕時,它向該工具條的屬主視窗傳送一條命令訊息。通常,工具條中的按鈕對應於應用程式的選單中的項;這些按鈕為用戶訪問一個應用程式的命令提供了更為直接的方法。
CToolBarCtrl對象包含幾個重要的內部數據結構:一個按鈕圖像列表或一個圖像列表,一個按鈕標籤字元串列表和一個TBBUTTON結構的列表,該結構使一個圖像和/或字元串與按鈕的位置,風格,主題和命令ID相關聯。這些數據結構的每一個都由一個從零開始的索引來引用。在你可以使用一個CToolBarCtrl對象之前,你必須設定這些數據結構。字元串列表只能被用作按鈕標籤;不能從按鈕中檢取字元串。

使用步驟

要使用一個CToolBarCtrl對象,通常你應該遵循下面的這些步驟:
1. 構造該CToolBarCtrl對象。
2. 調用Create來創建Windows工具條通用控制項並將它與該CToolBarCtrl對象連線。通過使用風格來指定工具條的風格,如對一個透明的工具條使用TBSTYLE_ TRANSPARENT,或對一個支持風格按鈕的工具條使用TBSTYLE_DROPDOWN。
3. 指明你希望按鈕在工具條上如何顯示: · 給按鈕使用點陣圖圖像,通過調用AddBitmap將按鈕點陣圖添加到工具條中。 · 給按鈕使用來自一個圖像列表的圖像,通過調用SetImageList,SetHotImageList,或SetDisabledImageList來指定圖像列表。 · 給按鈕使用字元串標籤,通過調用AddString和/或AddStrings來將字元串添加到工具條中。
4. 通過調用AddButtons將按鈕結構添加到工具條中。
5. 如果你希望在一個不是CFrameWnd的屬主視窗中的工具條具有工具提示,則你必須在工具條的屬主視窗中處理TTN_NEEDTEXT訊息,就像在CToolBarCtrl:處理工具提示通知中描述的一樣。如果工具條的父視窗是由CFrameWnd派生而來的,則你不用作任何額外的努力就可以顯示工具提示,因為CFrameWnd提供了一個預設的處理函式。
6. 如果你希望能夠讓用戶定製工具條,則在屬主視窗中處理定製通知訊息,就像在CToolBarCtrl:處理定製通知中描述的一樣。
你可以使用SaveState來將一個工具條控制項的當前狀態保存在註冊表中,用RestoreState來根據註冊表中先前保存的信息恢復工具條的狀態。除了在應用程式的使用之間保存工具條的狀態,通常在用戶開始定製該工具條之前應用程式會保存工具條的狀態,以防用戶後來想將工具條恢復到它的最初的狀態。
為Internet Explorer 4.0或更新版提供的支持
要支持在Internet Explorer 4.0或更新版之後引入的性能,MFC提供了圖像列表支持,為工具條提供了透明和平坦風格。
一個透明的工具條允許在工具條下的客戶被透過工具條顯示出來。要創建一個透明的工具條,要同時使用TBSTYLE_FLAT和TBSTYLE_TRANSPARENT風格。透明的工具條具有熱點跟蹤的特色;就是說,當滑鼠指針移動到工具條的一個熱點按鈕上時,按鈕的外觀改變。只用TBSTYLE_FLAT風格創建的工具條將包含不透明的按鈕。
圖像列表支持使控制項的預設行為具有更大的靈活性,並支持熱點圖像和無效的圖像。對透明的工具條使用GetImageList,GetHotImageList和GetDisabledImageList可以根據它的狀態來操縱圖像。
有關使用CToolBarCtrl的更多信息,參見“Visual C++程式設計師指南”中的“控制項主題”和“使用CToolBarCtrl”。
#include <afxcmn.h>
請參閱:CToolBar
CToolBarCtrl類成員

構造

CToolBarCtrl構造一個CToolBarCtrl對象Create創建一個工具條控制項並將它與一個CToolBarCtrl對象連線

屬性

IsButtonEnabled指示一個工具條控制項中的指定按鈕是否是有效的IsButtonChecked指示一個工具條控制項中的指定按鈕是否被核選了IsButtonPressed指示一個工具條控制項中的指定按鈕是否被壓住IsButtonHidden指示一個工具條控制項中的指定按鈕是否被隱藏IsButtonindeterminate指示一個工具條控制項中的指定按鈕的狀態是否是不確定的(灰的)SetState設定一個工具條控制項中的指定按鈕的狀態GetState獲取關於一個工具條控制項中的指定按鈕的狀態的信息,比如它是有效的、被壓住的,或是被核選的GetButton獲取一個工具條控制項中的指定按鈕的信息GetButtonCount獲取當前在該工具條控制項中的按鈕的數目GetItemRect獲取一個工具條控制中的按鈕的邊界矩形GetRect獲取一個特定工具條按鈕的邊界矩形SetButtonStructSize指定TBBUTTON結構的大小GetButtonSize獲取的像素表示的工具條按鈕當前寬度和高度SetButtonSize設定要被添加到一個工具條控制項中去的按鈕的尺寸SetBitmapSize設定要被添加到一個工具條控制項中去的點陣圖圖像的尺寸GetToolTips獲取與此工具條控制項相關聯的工具提示控制項(如果有的話)的句柄SetToolTips將一個工具提示控制項與該工具條控制項關聯SetOwner設定接收來自工具條控制項的通知訊息的視窗GetRows獲取當前顯示在工具條中的按鈕的行數SetRows設定顯示在工具條中的按鈕的行數SetCmdID設定當指定按鈕被按下時,要傳送到屬主視窗的命令標識符GetBitmapFlags獲取與工具條點陣圖相關聯的標誌GetDisabledImageList獲取被一個工具條控制項用來顯示無效按鈕的圖像列表GetHotImageList獲取被一個工具條控制項用來顯示“熱點”按鈕的圖像列表。當滑鼠指針在一個熱點控制項上時,該控制項被加亮顯示GetImageList獲取被一個工具條控制項用來顯示預設狀態按鈕的圖像列表GetStyle獲取一個工具條控制項當前使用的風格GetMaxTextRows獲取顯示在一個工具條按鈕上的文本行的最大行數IsButtonHighlighted檢驗工具條控制項的加亮狀態SetButtonWidth設定工具條控制項中的按鈕寬度的最大和最小值SetDisabledImageList設定將要被工具條控制項用來顯示無效按鈕的圖像列表SetHotImageList設定將要被工具條控制項用來顯示“熱點”按鈕的圖像列表SetImageList設定將要被工具條控制項用來顯示預設狀態按鈕的圖像列表GetDropTarget獲取一個工具條控制項的IDropTarget接口SetIndent設定一個工具條控制項中的第一個按鈕的縮排SetMaxTextRows設定一個工具條按鈕所顯示的最大文本行數SetStyle設定一個工具條控制項的風格GetAnchorHighlight獲取一個工具條的固定的加亮設定SetAnchorHighlight設定一個工具條的固定的加亮設定GetHotItem獲取一個工具條中的熱點項的索引SetHotItem設定一個工具條中的熱點項的索引GetInsertMark獲取工具條的當前插入標記SetInsertMark設定工具條的當前插入標記GetMaxSize獲取工具條中的所有可視按鈕和分隔線的總的尺寸InsertMarkHitTest獲取一個工具條中的某個點的插入標記信息GetExtendedStyle獲取一個工具條控制項的擴展風格SetExtendedStyle設定一個工具條控制項的擴展風格GetInsertMarkColor獲取用來繪製工具條的插入標記的顏色SetInsertMarkColor設定用來繪製工具條的插入標記的顏色MapAccelerator將一個加速鍵映射到一個工具條按鈕MoveButton將一個按鈕從一個索引移動到另一個索引HitTest確定一個點位於一個工具條控制項的什麼地方

操作

EnableButton使一個工具條控制項中的按鈕有效或無效CheckButton核選或清除一個工具條控制項中的指定按鈕PressButton按下或釋放一個工具條控制項中的指定按鈕GetButtonInfo獲取工具條中的一個按鈕的信息SetButtonInfo設定工具條中的一個按鈕的信息SetDrawTextFlags設定Win 32中DrawText功能的標誌,該功能通常根據標誌設定的指定矩形、格式設定文本HideButton隱藏或顯示一個工具條控制項中的指定按鈕Indeterminate設定或清除一個工具條控制項中的指定按鈕的不確定(灰的)狀態AddBitmap將一個或更多個點陣圖按鈕圖像添加到一個工具條控制項可用的按鈕圖像列表中AddButtons將一個或多個按鈕添加到一個工具條按鈕中InsertButton在一個工具條控制項中插入一個按鈕DeleteButton從該工具條控制項中刪除一個按鈕CommandToIndex獲取與指定的命令標識符相關聯的按鈕的從零開始的索引RestoreState恢復該工具條控制項的狀態MarkButton設定在一個工具條控制項中給定的高亮狀態LoadImages將點陣圖定位到工具條控制項的圖像列表中SaveState保存該工具條控制項的狀態Customize顯示CustomizeToolbar對話框AddString將作為一個資源ID傳遞的新字元串添加到工具條的內部字元串列表中AddStrings將一個或多個新字元串添加到工具條的內部字元串列表中,是通過傳遞指向這些用。空字元分隔的字元串的緩衝區的指針來傳遞這些字元串的AutoSize調整一個工具條控制項的尺寸
CToolBarCtrl:處理工具提示通知
當你指定工具條具有TBSTYLE_TOOLTIPS風格時,該工具條創建並管理一個工具提示控制項。一個工具提示是一個小的彈出視窗,該視窗包含了一行用於描述一個工具條按鈕的文本。通常該工具提示是被隱藏的,只有當用戶將游標放在一個工具條按鈕上並停留大概半秒時間時它才顯示出來。工具提示顯示在游標的附近。
在工具提示被顯示之前,TTN_NEEDTEXT通知訊息被傳送給該工具條的屬主視窗,以獲取對應於該按鈕的描述文本。如果該工具條的屬主視窗是一個CFrameWnd視窗,則不需要任何額外的工作就會顯示工具提示,因為CFrameWnd有一個預設的TTN_NEEDTEXT通知處理函式。如果該工具條的屬主視窗不是由CFrameWnd派生而來的,比如是一個對話框或格式視,則你必須在你的屬主視窗的訊息映射中添加一項,並在訊息映射中提供一個通知處理函式。下面就是要被添加到你的屬主視窗的訊息映射:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, memberFxn )
memberFxn 當這個按鈕的文本需要顯示時將被調用的成員函式。
注意,一個工具提示的id總是0。
除了TTN_NEEDTEXT通知,一個工具提示控制項可以向一個工具條控制項傳送下列通知:
通知訊息含義 TTN_NEEDTEXTA 需要ASCII文本的工具提示控制項(只在Win95下)TTN_NEEDTEXTW 需要UNICODE文本的工具提示控制項(只在Windows NT下)TBN_HOTITEMCHANGE 表示熱點(被加亮的)項已經改變了NM_RCLICK 表示用戶用滑鼠右鍵單擊一個按鈕TBN_DRAGOUT 表示用戶點擊按鈕並拖動指針離開了按鈕。它支持應用程式實現對一個工具條按鈕的拖放。但接收到這個通知時,應用程式將開始拖放操作TBN_DROPDOWN 表示用戶已經點擊了一個使用TBSTYLE_DROPDOWN風格的按鈕TBN_GETOBJECT 表示用戶已經將指針移動到了一個使用TBSTYLE_DROPDOWN風格的按鈕上
處理函式的例子和有關使能工具提示的更多信息,參見“Visual C++程式設計師指南”中的“工具提示”。
CToolBarCtrl:處理定製通知
一個Windows工具條通用控制項具有內在的定製特徵,包括一個系統定義的定製對話框,用來讓用戶插入、刪除,或重新安排工具條按鈕。應用程式決定定製是否有效,並控制用戶對該工具條定製的限度。
你可以通過給予工具條CCS_ADJUSTABLE風格來使這些定製特徵對於用戶來說是可用的。此定製特徵允許用戶將一個按鈕拖動到一個新的位置,或通過拖動按鈕離開工具條來刪除這個按鈕。另外,用戶可以雙擊工具條來顯示Customize Toolbar對話框,讓用戶添加、刪除,或重新安排工具條按鈕。應用程式可以通過使用Custoimize成員函式來顯示對話框。
在定製過程中的每一步,工具條控制項都向父視窗傳送通知訊息。如果用戶按住SHIFT鍵並開始拖動一個按鈕,則工具條自動處理這個拖動操作。工具條傳送TBN_QUERYDELETE通知訊息給父視窗,以確定是否應該刪除該按鈕。如果父視窗返回FALSE,則這個拖動操作結束。否則,工具條捕捉滑鼠輸入並等待用戶釋放滑鼠按鈕。
當用戶釋放滑鼠按鈕時,工具條控制項確定滑鼠游標所在的位置。如果該游標的位置是在工具條之外,則按鈕被刪除。如果游標位於另一個工具條按鈕上,則工具條向其父視窗傳送TBN_QUERYINSERT通知訊息,以確定是否要將一個按鈕插入在給定按鈕的左邊。如果父視窗返回TRUE,則該按鈕被插入;否則,不插入。工具條傳送TBN_TOOLBARCHANGE通知來表示拖動操作結束。
如果用戶在沒有按下SHIFT鍵的情況下開始一次拖動操作,則工具條控制項傳送TBN_BEGINDRAG通知訊息給屬主視窗。一個實現了自己的按鈕拖動代碼的應用程式可以使用這個訊息作為開始一次拖動操作的信號。工具條傳送TBN_ENDDRAG通知訊息來表示拖動操作結束。
當用戶通過使用Customize Toolbar對話框來定製一個工具條時,該工具條控制項傳送通知訊息。在用戶雙擊工具條之後,但在對話框被創建之前,該工具條傳送TBN_BEGINADJUST通知訊息。然後,工具條開始傳送一系列TBN_QUERYINSERT訊息,以確定該工具條是否允許插入按鈕。當父視窗返回TRUE時,該工具條停止傳送TBN_QUERYINSERT通知訊息。如果父視窗沒有對任何按鈕返回TRUE,則工具條銷毀該對話框。
接著,工具條控制項通過為工具條中的每一個按鈕傳送一個TBN_QUERYDELETE通知訊息來確定是否可以從工具條中刪除某個按鈕。父視窗返回TRUE則表示可以刪除該按鈕;否則,父視窗返回FALSE。工具條將所有的按鈕都添加到對話框中,但是將那些不能刪除的按鈕變灰。
不管什麼時候,當工具條控制項需要有關Customize Toolbar對話框中的某個控制項的信息時,它就傳送TBN_GETBUTTONINFO通知信息,並指定它想獲取其信息的按鈕的索引,以及一個TBNOTIFY結構的地址。父視窗必須用相關的信息填充該結構。
Customize Toolbar對話框還包括一個Help按鈕和一個Reset按鈕。當用戶選擇Help按鈕時,工具條控制項傳送TBN_CUSTHELP通知訊息。父視窗應該通過顯示幫助信息來作出回響。當用戶選擇Reset按鈕時,對話框傳送TBN_RESET訊息。這個訊息表示工具條要再次初始化這個對話框。
這些訊息都是WM_NOTIFY訊息,通過向你的屬主視窗的訊息映射中添加下列形式的訊息映射項,你可以在你的屬主視窗中處理它們。
ON_NOTIFY(wNotifyCode, idControl,memberFxn)
wNotifyCode 通知訊息標識符代碼,比如TBN_BEGINADJUST。idControl 傳送通知的控制項的標識符。memberFxn 當這個通知被接收時要被調用的成員函式。
你的成員函式應該用下面的原形來聲明:
afx_msg void memberFxn( NMHDR* pNotifyStruct, LRESULT* result );
如果通知訊息的處理函式返回一個值,則處理函式應該將這個值存放在由result指向的LRESULT中。
對每一個訊息,pNotifyStruct指向一個NMHDR結構或一個TBNOTIFY結構。
這些結構被描述如下:NMHDR結構包含了下列成員:
typedef struct tagNMHDR
{
HWND hwndFrom; // 傳送訊息的控制項的句柄
UINT idFrom; // 傳送訊息的控制項的標識符
UINT code; // 通知代碼,參見下面
} NMHDR;
hwndFrom 正傳送通知的控制項的視窗句柄。要將這個句柄轉換為一個CWnd指針,可以使用CWnd::FromHandle。idFrom 傳送通知的控制項的標識符。code 通知代碼。這個成員可以是一個特定於一個控制項類型的值,比如TBN_BEGINADJUST 或TTN_NEEDTEXT,或者它可以是下面列出的普通通知值中的一個: · NM_CLICK 用戶在控制項中單擊了滑鼠的左按鈕。 · NM_DBLCLK 用戶在控制項中雙擊了滑鼠的左按鈕。 · NM_KILLFOCUS 控制項失去了輸入焦點。 · NM_OUTOFMEMORY 由於沒有足夠的可用記憶體,控制項無法完成一次操作。 · NM_RCLICK 用戶在控制項中單擊了滑鼠的右按鈕。 · NM_RDBLCLK 用戶在控制項中雙擊了滑鼠的右按鈕。 · NM_RETURN 控制項擁有輸入焦點,並且用戶按下了ENTER鍵。 · NM_SETFOCUS 控制項已經接收了輸入焦點。 TBNOTIFY結構包含下列成員:
typedef struct
{
NMHDR hdr; // 對所有WM_NOTIFY訊息都通用的信息
int iItem; // 與通知相關聯的控制項的的索引
TBBUTTON tbButton; // 與通知相關聯的控制項的信息
int cchText; // 按鈕文本中的字元數
LPSTR lpszText; // 按鈕文本的地址
} TBNOTIFY, FAR* LPTBNOTIFY;
hdr 對所有WM_NOTIFY訊息都通用的信息。iItem 與通知相關聯的控制項的的索引。tbButton 包含與通知相關聯的工具條控制項信息的BBUTTON結構。cchText 按鈕文本中的字元數。lpszText 指向按鈕文本的指針。
工具條傳送下列信息:
· TBN_BEGINADJUST 當用戶開始定製一個工具條控制項時傳送此通知。指針指向的NMHDR結構包含了有關這個通知的信息。處理程式不需要返回任何值。· TBN_BEGINDRAG 當用戶開始拖動一個工具條控制項中的按鈕時傳送此通知。指針指向一個TBNOTIFY結構。iItem成員包含了被拖動的按鈕的從零開始的索引。處理程式不需要返回任何特定的值。· TBN_CUSTHELP 當用戶在Customize Toolbar對話框中選擇了Help按鈕時傳送此通知。沒有返回值。指針指向一個NMHDR結構,該結構包含了有關這個通知訊息的信息。處理程式不需要返回任何特定的值。· TBN_ENDADJUST 當用戶停止定製有關工具條時傳送此通知。指針指向一個NMHDR結構,該結構包含了有關此通知訊息的信息。處理程式不需要返回任何特定的值。· TBN_ENDDRAG 當用戶停止拖動一個工具條控制項中的按鈕時傳送此通知。指針指向一個TBNOTIFY結構。iItem成員包含了被拖動的按鈕的從零開始的索引。處理程式不需要返回任何特定的值。· TBN_GETBUTTONINFO 當用戶正在定製一個工具條控制項時傳送此通知。工具條使用這個通知訊息來獲取Customize Toolbar對話框需要的信息。指針指向一個TBNOTIFY結構。iItem成員指定了一個按鈕的從零開始的索引。lpszText和cchText成員指定當前按鈕文本的地址和以字元數表示的長度。應用程式應該用有關這個按鈕的信息來填充該結構。如果按鈕的信息被拷貝到了結構中,則返回TRUE;否則就返回FALSE。· TBN_QUERYDELETE 當用戶正在定製一個工具條時傳送此訊息,以確定一個按鈕是否可以被從工具條控制項中刪除。指針指向一個TBNOTIFY結構。iItem成員包含了要被刪除的按鈕的從零開始的索引。如果允許該按鈕被刪除則返回TRUE;否則返回 FALSE來禁止該按鈕被刪除。· TBN_QUERYINSERT 當用戶正在定製一個工具條控制項時傳送此通知,以確定一個按鈕是否可以被插入到指定按鈕的左邊。指針指向一個TBNOTIFY結構。iItem成員包含了要被插入的按鈕的從零開始的索引。如果允許一個按鈕被插入到給定按鈕的前面,則返回TRUE;否則返回FALSE來禁止該按鈕被插入。· TBN_RESET 當用戶重新設定Customize Toolbar對話框時傳送此通知。指針指向一個NMHDR結構,該結構包含了有關這個通知訊息的信息。處理程式不需要返回任何特定的值。· TBN_TOOLBARCHANGE 在用戶定製完一個工具條控制項之後傳送此通知。指針指向一個NMHDR結構,該結構包含了有關這個通知訊息的信息。處理程式不需要返回任何特定的值。

相關詞條

相關搜尋

熱門詞條

聯絡我們