Windows 工具列通用控制元件具有內建自定義功能,包括系統定義的自訂對話框,可讓使用者插入、刪除或重新排列工具列按鈕。 應用程式會判斷自定義功能是否可用,並控制使用者可以自定義工具列的範圍。
您可以提供工具列 CCS_ADJUSTABLE 樣式,讓使用者可以使用這些自定義功能。 自定義功能可讓使用者將按鈕拖曳至新位置,或藉由將按鈕從工具列拖曳出去來移除按鈕。 此外,使用者可以按兩下工具列以顯示 [ 自訂工具列 ] 對話框,讓使用者新增、刪除及重新排列工具列按鈕。 應用程式可以使用 自定義 成員函式來顯示對話框。
工具列控制件會在自訂程式的每個步驟,將通知訊息傳送至父視窗。 如果使用者按住 SHIFT 鍵並開始拖曳按鈕,工具欄會自動處理拖曳作業。 工具列會將 TBN_QUERYDELETE 通知訊息傳送至父視窗,以判斷是否可以刪除按鈕。 如果父視窗傳回 FALSE,拖曳作業就會結束。 否則,工具列會擷取滑鼠輸入,並等候使用者放開滑鼠按鈕。
當使用者放開滑鼠按鈕時,工具列控件會決定滑鼠游標的位置。 如果游標位於工具列之外,則會刪除按鈕。 如果游標位於另一個工具列按鈕上,工具列會將 TBN_QUERYINSERT 通知訊息傳送至父視窗,以判斷按鈕是否可能插入指定按鈕的左邊。 如果父視窗傳回 TRUE,則會插入按鈕;否則不會。 工具列會傳送 TBN_TOOLBARCHANGE 通知訊息,以發出拖曳作業結尾的訊號。
如果使用者開始拖曳作業而不按住 SHIFT 鍵,工具列控件會將 TBN_BEGINDRAG 通知訊息傳送至擁有者視窗。 實作自己按鈕拖曳程式代碼的應用程式可以使用此訊息作為開始拖曳作業的訊號。 工具列會傳送 TBN_ENDDRAG 通知訊息,以發出拖曳作業結尾的訊號。
當使用者使用 [ 自訂工具列 ] 對話框自訂工具列時,工具列控件會傳送通知訊息。 工具列會在使用者按兩下工具列之後,但在建立對話方塊之前,傳送 TBN_BEGINADJUST 通知訊息。 接下來,工具列會開始傳送一系列 TBN_QUERYINSERT 通知訊息,以判斷工具列是否允許插入按鈕。 當父視窗傳回 TRUE 時,工具列會停止傳送 TBN_QUERYINSERT 通知訊息。 如果父視窗未傳回任何按鈕 的 TRUE ,工具列就會終結對話方塊。
接下來,工具列控件會傳送工具列中每個按鈕的一 個TBN_QUERYDELETE 通知訊息,以判斷是否可從工具列中刪除任何按鈕。 父視窗會傳回 TRUE ,表示可能會刪除按鈕;否則會傳回 FALSE。 工具列會將所有工具列按鈕新增至對話框,但會將那些可能不會刪除的按鈕呈現灰色。
每當工具列控件需要 [自定義工具列] 對話框中按鈕的相關信息時,就會傳送 TBN_GETBUTTONINFO 通知訊息,並指定它需要資訊和 TBNOTIFY 結構地址的按鈕索引。 父窗口必須以相關信息填滿結構。
[ 自訂工具列] 對話框包含 [說明] 按鈕和 [重設] 按鈕。 當使用者選擇 [說明] 按鈕時,工具列控件會傳送 TBN_CUSTHELP 通知訊息。 父視窗應顯示說明資訊以作出回應。 當使用者選取 [重設] 按鈕時,對話框會傳送 TBN_RESET 通知訊息。 此訊息表示工具列即將重新初始化對話方塊。
這些訊息全部屬於 WM_NOTIFY 訊息,可以透過將下列格式的訊息映射條目新增到擁有視窗的訊息映射中來處理這些訊息。
ON_NOTIFY( wNotifyCode, idControl, memberFxn )
wNotifyCode
通知訊息標識碼,例如 TBN_BEGINADJUST。
idControl
傳送通知之控件的標識碼。
memberFxn
收到此通知時要呼叫的成員函式。
您的成員函式會以下列原型宣告:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
如果通知訊息處理程式傳回值,它應該會將它放在結果所指向的 LRESULT 中。
針對每個訊息, pNotifyStruct 指向 NMHDR 結構或 TBNOTIFY 結構。 這些結構如下所述:
NMHDR 結構包含下列成員:
typedef struct tagNMHDR {
HWND hwndFrom; // handle of control sending message
UINT idFrom;// identifier of control sending message
UINT code; // notification code; see below
} NMHDR;
hwndFrom
傳送通知的控制項之視窗句柄。 若要將此句柄
CWnd轉換成指標,請使用 CWnd::FromHandle。idFrom
傳送通知之控件的標識碼。
程式碼
通知程序代碼。 這個成員可以是控件類型特定的值,例如 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; // information common to all WM_NOTIFY messages
int iItem; // index of button associated with notification
TBBUTTON tbButton; // info about button associated withnotification
int cchText; // count of characters in button text
LPSTR lpszText;// address of button text
} TBNOTIFY, FAR* LPTBNOTIFY;
hdr
所有 WM_NOTIFY 訊息通用的資訊。
iItem
與通知相關聯的按鈕索引。
tbButton
TBBUTTON 結構,其中包含與通知相關聯的工具列按鈕相關信息。
cchText
按鈕文字中的字元計數。
lpszText
按鈕文字的指標。
工具列傳送的通知如下所示:
TBN_BEGINADJUST
當用戶開始自定義工具列控件時傳送。 指標指向包含通知相關信息的 NMHDR 結構。 處理程式不需要傳回任何特定值。
TBN_BEGINDRAG
當用戶開始拖曳工具列控件中的按鈕時傳送。 指標指向 TBNOTIFY 結構。 iItem 成員包含要拖曳之按鈕的以零起始的索引。 處理程式不需要傳回任何特定值。
TBN_CUSTHELP
當使用者在 [自訂工具列] 對話框中選擇 [說明] 按鈕時傳送。 沒有傳回值。 指標指向包含通知訊息相關信息的 NMHDR 結構。 處理程式不需要傳回任何特定值。
TBN_ENDADJUST
當使用者停止自定義工具列控件時傳送。 指標指向包含通知訊息相關信息的 NMHDR 結構。 處理程式不需要傳回任何特定值。
TBN_ENDDRAG
當使用者停止拖曳工具列控件中的按鈕時傳送。 指標指向 TBNOTIFY 結構。 iItem 成員包含要拖曳之按鈕的以零起始的索引。 處理程式不需要傳回任何特定值。
TBN_GETBUTTONINFO
當使用者自定義工具列控制件時傳送。 工具列會使用此通知訊息來擷取 [自訂工具列] 對話框所需的資訊。 指標指向 TBNOTIFY 結構。 iItem 成員會指定按鈕以零起始的索引。 pszText 和 cchText 成員會以字元指定目前按鈕文字的地址和長度。 應用程式應該以按鈕的相關信息填滿 結構。 如果按鈕資訊已複製到 結構,則傳回 TRUE ,否則傳回 FALSE 。
TBN_QUERYDELETE
當使用者自定義工具列時傳送,以判斷是否可以從工具列控件中刪除按鈕。 指標指向 TBNOTIFY 結構。 iItem 成員包含要刪除之按鈕的以零起始的索引。 傳回 TRUE 以允許刪除按鈕或 FALSE ,以防止刪除按鈕。
TBN_QUERYINSERT
當使用者自定義工具列控件時傳送,以判斷是否可以將按鈕插入指定按鈕的左邊。 指標指向 TBNOTIFY 結構。 iItem 成員包含要插入之按鈕之以零起始的索引。 傳回 TRUE 以允許在指定的按鈕前面插入按鈕或 FALSE ,以防止插入按鈕。
TBN_RESET
當使用者重設 [自訂工具列] 對話框的內容時傳送。 指標指向包含通知訊息相關信息的 NMHDR 結構。 處理程式不需要傳回任何特定值。
TBN_TOOLBARCHANGE
在使用者自定義工具列控件之後傳送。 指標指向包含通知訊息相關信息的 NMHDR 結構。 處理程式不需要傳回任何特定值。