处理自定义通知

窗口工具栏公共控件具有内置自定义功能,包括一个系统定义的自定义对话框,允许用户插入,删除或重新排列工具栏按钮。 应用程序确定自定义功能是否可用以及控件用户可以自定义工具栏的区域。

可让这些自定义功能提供给用户通过为 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
    发送通知的控件的标识符。

  • code
    通知代码。 此成员可为值特定于某个控件类型,如 TBN_BEGINADJUSTTTN_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 成员指定按钮的从零开始的索引。 pszTextcchText 成员在字符指定该地址和长度,,当前按钮文本。 应用程序应当由有关按钮的信息加载机制。 返回否则 TRUE ,如果按钮信息复制到了结构,或 FALSE

  • TBN_QUERYDELETE 发送时,用户自定义工具栏按钮时确定是否可以从工具栏控件被删除。 指针指向 TBNOTIFY 结构。 iItem 成员包含要删除的按钮的从零开始的索引。 返回 TRUE 允许按钮删除或 FALSE 防止按钮被删除。

  • TBN_QUERYINSERT 发送时,用户自定义一个工具栏控件时确定按钮是否可以在特定按钮左侧插入。 指针指向 TBNOTIFY 结构。 iItem 成员包含要插入的按钮的从零开始的索引。 返回 TRUE 允许按钮在特定按钮或 FALSE 前面插入防止按钮插入。

  • ,当用户重置自定义工具栏 " 对话框的内容时,TBN_RESET 发送的。 指针指向 NMHDR 包含有关通知消息的信息的结构。 处理程序不需要返回任何特定值。

  • ,在用户自定义一个工具栏控件之后,TBN_TOOLBARCHANGE 发送的。 指针指向 NMHDR 包含有关通知消息的信息的结构。 处理程序不需要返回任何特定值。

请参见

参考

使用CToolBarCtrl

概念

控件(MFC)