處理自訂告知
Windows 工具列通用控制項有內建自訂功能,包含系統定義的自訂對話方塊中,這可讓使用者插入、 刪除或重新整理工具列按鈕。 應用程式可決定自訂功能是否可用,並控制使用者可以自訂工具列。
您可以提供這些自訂功能給使用者藉由工具列CCS_ADJUSTABLE樣式。 自訂功能可讓使用者將按鈕拖到新位置,或移除一個按鈕拖離工具列。 此外,使用者也可以按兩下工具列以顯示自訂工具列對話方塊,它可讓使用者新增、 刪除及重新整理工具列按鈕。 應用程式可以顯示對話方塊,藉由使用自訂成員函式。
工具列控制項會傳送告知訊息給父視窗,每個步驟中自訂程序。 如果使用者按住 SHIFT 鍵並開始拖曳按鈕時,工具列就會自動處理拖曳作業。 工具列傳送 TBN_QUERYDELETE 給父視窗的通知訊息,以決定是否要刪除的按鈕。 拖曳作業結束如果父視窗傳回 ,則為 FALSE。 否則,工具列會捕捉滑鼠輸入,並等待使用者釋放滑鼠按鈕。
當使用者鬆開滑鼠按鈕時,toolbar 控制項的滑鼠指標位置來決定。 如果游標是在工具列之外,則會刪除該按鈕。 如果游標位於另一個工具列按鈕,工具列會傳送 TBN_QUERYINSERT 給父視窗的通知訊息,以決定如果按鈕可能會插入左邊的 [指定] 按鈕。 如果父視窗傳回,按鈕會插入 ,則為 TRUE。 否則,它不是。 工具列傳送 TBN_TOOLBARCHANGE 通知訊息到拖放作業的結尾標示出來。
如果使用者開始拖放作業,無需一直按住 SHIFT 鍵,toolbar 控制項便會傳送 TBN_BEGINDRAG 給主控視窗的通知訊息。 實作它自己的按鈕拖曳程式碼的應用程式可以使用這封郵件的信號開始拖曳作業。 工具列傳送 TBN_ENDDRAG 通知訊息到拖放作業的結尾標示出來。
Toolbar 控制項使用者藉由使用自訂工具列時,傳送告知訊息自訂工具列對話方塊。 工具列傳送 TBN_BEGINADJUST 通知訊息之後使用者按兩下工具列上,但建立方塊之前的對話方塊。 接下來,工具列便開始傳送一系列的 TBN_QUERYINSERT 告知訊息來決定工具列是否允許要插入的按鈕。 當父視窗傳回 ,則為 TRUE,工具列會停止傳送 TBN_QUERYINSERT 告知訊息。 如果父視窗不會傳回 ,則為 TRUE 的任一個按鈕,工具列會終結對話方塊。
工具列控制項會接下來,決定是否可能被任何按鈕從工具列刪除藉由傳送一個 TBN_QUERYDELETE 每個按鈕在工具列上的通知訊息。 父視窗傳回 ,則為 TRUE 來指示的按鈕可能會被刪除。 否則,它會傳回 ,則為 FALSE。 工具列會將所有的工具列按鈕加入至對話方塊中,但變灰,且可能不會被刪除。
每當工具列控制項必須在 [自訂工具列] 對話方塊中的一個按鈕的相關資訊,它會傳送 TBN_GETBUTTONINFO 通知訊息時,指定其需要資訊的按鈕索引及位址的 TBNOTIFY 結構。 父視窗必須填入相關資訊的結構。
自訂工具列對話方塊包含 [說明] 按鈕和重設] 按鈕。 當使用者選擇 [說明] 按鈕時,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;
備註
首
所有的共通資訊 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 結構,其中包含的通知訊息的相關資訊。 這個處理常式不需傳回任何特定的值。