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 结构。 处理程序不需要返回任何特定值。