按钮消息

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

本节将讨论以下主题。

将消息发送到按钮

父窗口可以使用 SendMessage 函数将消息发送到重叠窗口或子窗口中的按钮, 或者,它可以使用 SendDlgItemMessageCheckDlgButtonCheckRadioButton以及 IsDlgButtonChecked 函数将消息发送到对话框中的按钮。

应用程序可以使用 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 通知代码。 BN_DBLCLK 通知代码会自动为 BS_USERBUTTONBS_RADIOBUTTONBS_OWNERDRAW 按钮发送。 仅当其他按钮类型具有 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 时,预定义的窗口过程将检查消息并执行下表中列出的默认作。

消息 默认作
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 函数进行默认处理。

控制消息