2

我有 Windows 事件值,例如DefWindowsProc()获取 - 即hWnd, MsgId, wParam, lParam是否可以区分WM_COMMAND带有通知代码的事件BN_CLICKED是来自push button还是来自复选框(或可能来自其他一些)?

动机:我正在一个更大的应用程序中重写 GUI 实现和消息处理。最终的目标是wxWidgets,但我必须循序渐进。我确实模仿BEGIN_EVENT_TABLE/END_EVENT_TABLE宏和相关的EVT_BUTTON, EVT_CHECKBOX(..., EVT_SIZE,EVT_PAINT等等)。我也在模仿类似的类wxCommandEvent,并且我想将其类型设置为等价于wxEVT_COMMAND_BUTTON_CLICKEDwxEVT_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宏是否未(错误地)用于按钮。如果是,则断言命令必须使其对程序的调试版本可见。

4

2 回答 2

4

消息本身中的任何内容都无法帮助您识别按钮的类型。但是,理论上您仍然应该能够间接找到它。为您提供控件的lParam窗口句柄,您可以使用它GetWindowLong来获取按钮样式

LONG style = ::GetWindowLong(lParam, GWL_STYLE);
if (style & BS_CHECKBOX) {
    // It's a checkbox
}
于 2012-05-14T11:35:16.270 回答
0

“在更大的应用程序中重写 GUI 实现和消息处理。最终目标是 wxWidgets,但我必须逐步完成。”

真的吗?恕我直言,你疯了。重写您的应用程序以使用 wxWidgets,而不是使用您自己动态创建的一些奇怪的半 wxWidgets、半原生 Windows API 会更容易、更快且错误更少。我能看到的唯一优势是工作保障,因为没有其他人能够维持你正在创造的这个怪物。

但是,要回答您的问题: wxWidgets 区分这两个事件。wxEVT_COMMAND_CHECKBOX_CLICKED 由复选框生成,wxEVT_COMMAND_BUTTON_CLICKED 由按钮生成。wxWidgets 代码是开放的并且有很好的文档记录,所以看看他们是如何做到的。

于 2012-05-14T13:13:46.923 回答