我有Windows事件值,例如DefWindowsProc()
获得 - 即hWnd, MsgId, wParam, lParam
。 是否可以区分 WM_COMMAND
事件是否来自通知代码BN_CLICKED
来自按钮,还是来自复选框(或可能来自其他一些人)?
动机:我正在更大的应用程序中重写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命令必须使其对程序的调试版本可见。
答案 0 :(得分:4)
消息本身中没有任何内容可以帮助您识别按钮的类型。但是,从理论上讲,你仍然可以间接地找到它。 lParam
为您提供了控件的窗口句柄,您可以使用GetWindowLong
来获取button style。
LONG style = ::GetWindowLong(lParam, GWL_STYLE);
if (style & BS_CHECKBOX) {
// It's a checkbox
}
答案 1 :(得分:0)
“在更大的应用程序中重写GUI实现和消息处理。最终目标是wxWidgets,但我必须逐步完成。”
真的?恕我直言你疯了。重写你的应用程序以使用wxWidgets会更容易,更快,更无错误,而不是使用一些奇怪的半wxWidgets,你自己动手创建的一半本机windows API。我能看到的唯一优势就是工作保障,因为没有人能够维持你正在创造的怪物。
然而,要回答你的问题:wxWidgets区分这两个事件。 wxEVT_COMMAND_CHECKBOX_CLICKED由复选框生成,wxEVT_COMMAND_BUTTON_CLICKED由按钮生成。 wxWidgets代码是开放的,并且有很好的文档记录,所以看看它们是如何做到的。