如何在 Windows 上区分按钮和复选框消息
How to distinguish a button and a checkbox message on Windows?
我有Windows事件值,例如DefWindowsProc()
得到 - 即 hWnd, MsgId, wParam, lParam
.是否可以区分带有通知代码BN_CLICKED
的WM_COMMAND
事件是来自按钮还是来自复选框(或可能来自其他某个复选框(?
动机:我正在一个更大的应用程序中重写 GUI 实现和消息处理。 最终目标是wxWidgets,但我必须逐步完成。 我确实模仿了BEGIN_EVENT_TABLE
/END_EVENT_TABLE
宏和相关EVT_BUTTON
,EVT_CHECKBOX
(...,EVT_SIZE
,EVT_PAINT
等(。 我也在模仿像 wxCommandEvent
这样的类,我想在原始代码捕获事件时将其类型设置为相当于 wxEVT_COMMAND_BUTTON_CLICKED
或 wxEVT_COMMAND_CHECKBOX_CLICKED
。
例如:我有一个这样的宏
#define EVT_CHECKBOX(id, func)
if (uMsg == WM_COMMAND && id == LOWORD(wParam))
{
CAppCommandEvent evt(hWnd, uMsg, wParam, lParam);
ATLASSERT(evt.GetEventType() == appEVT_COMMAND_CHECKBOX_CLICKED);
func(evt);
lResult = evt.GetLResult();
if (!evt.GetSkipped())
return TRUE;
}
wxEVT_COMMAND_CHECKBOX_CLICKED
被有意重命名为 appEVT_...
。 我希望能够检查EVT_CHECKBOX
宏是否未(错误地(用于按钮。 如果是,assert 命令必须使其对程序的调试版本可见。
消息本身中的任何内容都无法帮助您识别按钮的类型。但是,从理论上讲,您仍然应该能够间接找到它。lParam
为您提供控件的窗口句柄,您可以将其与GetWindowLong
一起使用以获取按钮样式。
LONG style = ::GetWindowLong(lParam, GWL_STYLE);
if (style & BS_CHECKBOX) {
// It's a checkbox
}
更大的应用程序中重写 GUI 实现和消息处理。最终目标是wxWidgets,但我必须逐步实现。
真? 恕我直言,你疯了。 重写应用程序以使用 wxWidgets 会更容易、更快、更少错误,而不是使用您自己动态创建的一些奇怪的半 wxWidgets、半原生 Windows API。 我能看到的唯一优势是工作保障,因为没有其他人能够维持你正在创造的这个怪物。
但是,要回答您的问题:wxWidgets 区分了这两个事件。 wxEVT_COMMAND_CHECKBOX_CLICKED由复选框生成,wxEVT_COMMAND_BUTTON_CLICKED由按钮生成。 wxWidgets代码是开放的,并且记录得很好,所以看看他们是如何做到的。
- 根据变量使Qt UI中的复选框为已选中/未选中
- "动态创建的事件处理程序"复选框
- 有没有办法在取消选中复选框时隐藏按钮?
- 如何删除Qt设计器中自定义插件的QString属性的"translatable"复选框?
- 设置复选框选项C++
- 如何在所有者描述的 MFC CMenu 派生菜单中显示复选框?
- 如何在MFC对话框应用程序中默认将复选框设置为选中?
- 如何使复选框独占
- AccessObjectFromPoint 返回客户端对象而不是复选框
- Windows 32 API:2个复选框作为一个
- 如何设置按钮的背景颜色,包括复选框按钮
- Qt复选框勾选所有按钮
- C++ 复选框就像单选按钮 WINAPI ( 无 MFC )
- 如何在 Windows 上区分按钮和复选框消息
- 使用 WINAPI 如何更改复选框按钮的值
- C++ MFC、带复选框的自定义网格、单选按钮
- MFC:如何在LVS_EX_CHECKBOXES样式的列表ctrl中获得复选框按钮的wnd
- Qt c++ QToolBox:如何添加复选框/按钮标题
- Qt QTableView实现切换按钮和复选框委托
- Qt复选框/工具按钮,带有自定义/不同的检查/未选中的图标