處理自訂告知
視窗工具列通用控制項具有內建的自訂功能,包括一個系統定義的自訂對話方塊,讓使用者插入,刪除或重新排列工具列按鈕。 應用程式決定是否將自訂功能可用且控制使用者自訂工具列的範圍。
您可以將這些自訂功能使用者傳遞給 CCS_ADJUSTABLE 樣式的工具列。 自訂功能可讓使用者將按鈕拖曳到新的位置或將它移除工具列按鈕。 此外,使用者可以按兩下工具列顯示 Customize Toolbar 對話方塊,讓使用者新增,刪除和重新排列工具列按鈕。 使用 自訂 成員函式,應用程式可以顯示對話方塊。
工具列控制項在自訂流程的每個步驟傳送通知訊息至父視窗。 如果使用者按下 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。 工具列加入所有工具列按鈕加入至對話方塊,顯示,但不能刪除的項目。
每當工具列控制項在自訂工具列對話方塊需要與按鈕的相關資訊,就會傳送 TBN_GETBUTTONINFO 通知訊息,並指定需要資訊和 TBNOTIFY 結構的位址按鈕的索引。 父視窗必須以相關資訊填滿結構。
Customize Toolbar 對話方塊含有說明按鈕和一個重設按鈕。 當使用者選取說明按鈕時,工具列控制項傳送 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 的索引點結構有關通知的相關通知訊息。 處理常式不需傳回任何特定值。