处理自定义通知

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

通过给工具栏 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_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)