按钮消息

按钮可以将消息发送到其父窗口,父窗口可以将消息发送到按钮。

以下是本节中要讨论的主题。

将消息发送到按钮

父窗口可以使用 SendMessage 函数将消息发送到重叠窗口或子窗口中的按钮,也可以通过使用 SendDlgItemMessageCheckDlgButtonCheckRadioButtonIsDlgButtonChecked 函数将消息发送到对话框中的按钮。

应用程序可以使用 BM_GETCHECK 消息来检索复选框或单选按钮的选中状态。 应用程序还可以使用 BM_GETSTATE 消息来检索按钮的当前状态(选中状态、按下状态和焦点状态)。 若要获取有关特定状态的信息,请对返回的状态值使用位掩码。

BM_SETCHECK 消息设置复选框或单选按钮的选中状态;该消息返回零。 BM_SETSTATE 消息设置按钮的按下状态;此消息也返回零。 BM_SETSTYLE 消息更改按钮的样式。 它旨在更改类型中的按钮样式(例如,将复选框更改为自动复选框)。 它不适用于在类型之间更改(例如,将复选框更改为单选按钮)。 应用程序不应将按钮从一种类型更改为另一种类型。

BS_BITMAPBS_ICON 样式的按钮显示位图或图标,而不是文本。 BM_SETIMAGE 消息将位图或图标的句柄与按钮相关联。 BM_GETIMAGE 消息检索与按钮关联的位图或图标的句柄。

应用程序还可以使用 DM_GETDEFID 消息检索对话框中默认按钮控件的标识符。 应用程序可以使用 DM_SETDEFID 消息设置对话框的默认按钮。

调用 CheckDlgButtonCheckRadioButton 函数等效于发送 BM_SETCHECK 消息。 调用 IsDlgButtonChecked 函数等效于发送 BM_GETCHECK 消息。

处理来自按钮的消息

来自按钮的通知以 WM_COMMANDWM_NOTIFY 消息的形式发送。 可在每个通知的参考页上找到有关使用哪些消息的信息。

有关如何处理消息的详细信息,请参阅控件消息。 另请参阅按钮消息。

来自按钮的通知消息

当用户单击某按钮时,其状态将更改,该按钮以 WM_COMMAND 消息的形式将通知代码发送到其父窗口。 例如,每当用户选择按钮时,按钮控件就会发送 BN_CLICKED 通知代码。 在所有情况下(BCN_HOTITEMCHANGE 除外),wParam 参数的低位字包含控件标识符,wParam 的高位字包含通知代码,lParam 参数包含控件窗口句柄。

消息和父窗口的响应都取决于按钮的类型、样式和当前状态。 以下是应用程序应监视和处理的按钮通知代码。

通知代码 说明
BCN_HOTITEMCHANGE 鼠标进入或离开按钮的工作区。
BN_CLICKED 用户单击一个按钮。
BN_DBLCLKBN_DOUBLECLICKED 用户双击一个按钮。
BN_DISABLE 按钮已禁用。
BN_PUSHEDBN_HILITE 用户按下了一个按钮。
BN_KILLFOCUS 按钮失去了键盘焦点。
BN_PAINT 应绘制按钮。
BN_SETFOCUS 按钮获得了键盘焦点。
BN_UNPUSHEDBN_UNHILITE 按钮不再按下。

 

仅当按钮具有 BS_NOTIFY 样式时,才会发送 BN_DISABLEBN_PUSHEDBN_KILLFOCUSBN_PAINTBN_SETFOCUSBN_UNPUSHED 通知代码。 自动为 BS_USERBUTTONBS_RADIOBUTTONBS_OWNERDRAW 按钮发送 BN_DBLCLK 通知代码。 仅当其他按钮类型具有 BS_NOTIFY 样式时,才会发送 BN_DBLCLK。 无论按钮样式如何,所有按钮都会发送 BN_CLICKED 通知代码。

对于自动按钮,系统会更改按下状态并绘制按钮。 在这种情况下,应用程序通常只处理 BN_CLICKEDBN_DBLCLK 通知代码。 对于非自动按钮,应用程序通常通过发送消息更改按钮的状态来响应通知代码。 有关将消息发送到按钮的信息,请参阅向按钮发送消息

当用户选择所有者绘制的按钮时,该按钮会向其父窗口发送 WM_DRAWITEM 消息,其中包含要绘制的控件的标识符及其维度和状态相关信息。

按钮颜色消息

系统为按钮提供默认颜色值。 应用程序可以通过调用 GetSysColor 函数来检索这些颜色的默认值,或者通过调用 SetSysColors 函数来设置值。 下表显示默认的按钮颜色值。

着色元素
COLOR_BTNFACE 按钮面。
COLOR_BTNHIGHLIGHT 突出显示按钮的上边缘和左边缘区域。
COLOR_BTNSHADOW 按钮的阴影区域(底部和右边缘)。
COLOR_BTNTEXT 按钮中的常规(非灰显)文本。
COLOR_GRAYTEXT 按钮中已禁用(灰色)文本。 如果当前显示驱动程序不支持纯灰色,则此颜色设置为 0。
COLOR_WINDOW 窗口背景。
COLOR_WINDOWFRAME 窗口框架。
COLOR_WINDOWTEXT 窗口中的文本。

 

但是,调用 SetSysColors 会影响所有应用程序,因此不应调用此函数来自定义应用程序的按钮。

在绘制按钮之前,系统将 WM_CTLCOLORBTN 消息发送到按钮的父窗口。 此消息包含按钮设备上下文的句柄和子窗口的句柄。 父窗口可以使用这些句柄更改按钮的文本和背景色。 但是,只有所有者绘制的按钮响应处理此消息的父窗口。

按钮默认消息处理

预定义按钮控制窗口类的窗口过程对按钮控制过程不处理的所有消息执行默认处理。 当按钮控制过程对任何消息返回 FALSE 时,预定义的窗口过程会检查该消息并执行下表中列出的默认操作。

Message 默认操作
BM_CLICK 向按钮发送 WM_LBUTTONDOWNWM_LBUTTONUP 消息,并向父窗口发送 BN_CLICKED 通知代码。
BM_GETCHECK 返回按钮的选中状态。
BM_GETIMAGE 如果按钮没有位图或图标,则返回与按钮关联的位图或图标的句柄或 NULL
BM_GETSTATE 返回按钮的当前选中状态、按下状态和焦点状态。
BM_SETCHECK 为所有样式的单选按钮和复选框设置选中状态。 如果单选按钮的 wParam 参数大于零,则为该按钮提供 WS_TABSTOP 样式。
BM_SETIMAGE 将指定的位图或图标句柄与按钮相关联,并将句柄返回到上一位图或图标。
BM_SETSTATE 设置按钮的按下状态。 对于所有者绘制的按钮,如果按钮的状态已更改,则会向父窗口发送 WM_DRAWITEM 消息。
BM_SETSTYLE 设置按钮样式。 如果 lParam 参数的低位字为 TRUE,则重新绘制按钮。
WM_CHAR 当用户按下加号 (+) 或等于 (=) 键时,选中复选框或自动复选框。 当用户按下减号 (–) 键时,清除复选框或自动复选框。
WM_ENABLE 绘制按钮。
WM_ERASEBKGND 清除所有者绘制的按钮的背景。 其他按钮的背景将作为 WM_PAINTWM_ENABLE 处理的一部分擦除。
WM_GETDLGCODE 返回的值指示默认按钮过程处理的输入类型,如下表所示。
按钮样式 返回
BS_AUTOCHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_AUTORADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON
BS_CHECKBOX DLGC_WANTCHARS | DLGC_BUTTON
BS_DEFPUSHBUTTON DLGC_DEFPUSHBUTTON | DLGC_BUTTON
BS_GROUPBOX DLGC_STATIC
BS_PUSHBUTTON DLGC_UNDEFPUSHBUTTON | DLGC_BUTTON
BS_RADIOBUTTON DLGC_RADIOBUTTON | DLGC_BUTTON

 

WM_GETFONT 返回当前字体的句柄。
WM_KEYDOWN 如果用户按下空格键,则按下该按钮。
WM_KEYUP 对于除 TAB 键以外的所有情况,释放鼠标捕获。
WM_KILLFOCUS 从按钮中移除焦点矩形。 对于按钮和默认按钮,焦点矩形将失效。 如果该按钮具有鼠标捕获,则会释放捕获,不会单击该按钮,并且删除任何按下状态。
WM_LBUTTONDBLCLK BN_DBLCLK 通知代码发送到单选按钮和所有者绘制的按钮的父窗口。 对于其他按钮,双击将作为 WM_LBUTTONDOWN 消息进行处理。
WM_LBUTTONDOWN 如果鼠标光标的位置位于按钮的客户端矩形中,则突出显示该按钮。
WM_LBUTTONUP 如果按钮具有鼠标捕获,则释放鼠标捕获。
WM_MOUSEMOVE 如果按钮具有鼠标捕获,则执行与 WM_LBUTTONDOWN 相同的操作。 否则,不执行任何操作。
WM_NCCREATE 将任何 BS_OWNERDRAW 按钮转换为 BS_PUSHBUTTON 按钮。
WM_NCHITTEST 如果按钮控件是组框,则返回 HTTRANSPARENT。
WM_PAINT 根据按钮的样式和当前状态绘制按钮。
WM_SETFOCUS 在获得焦点的按钮上绘制焦点矩形。 对于单选按钮和自动单选按钮,向父窗口发送 BN_CLICKED 通知代码。
WM_SETFONT 设置新字体,并根据需要更新窗口。
WM_SETTEXT 设置按钮的文本。 对于组框,消息会绘制在预先存在的文本上,然后用新文本重新绘制组框。
WM_SYSKEYUP 对于除 TAB 键以外的所有情况,释放鼠标捕获。

 

预定义的窗口过程将所有其他消息传递到 DefWindowProc 函数,以便进行默认处理。

控件消息