如何在 Windows 上区分按钮和复选框消息

How to distinguish a button and a checkbox message on Windows?

本文关键字:按钮 复选框 消息 Windows      更新时间:2023-10-16

我有Windows事件值,例如DefWindowsProc()得到 - 即 hWnd, MsgId, wParam, lParam .是否可以区分带有通知代码BN_CLICKEDWM_COMMAND事件是来自按钮还是来自复选框(或可能来自其他某个复选框(?

动机:我正在一个更大的应用程序中重写 GUI 实现和消息处理。 最终目标是wxWidgets,但我必须逐步完成。 我确实模仿了BEGIN_EVENT_TABLE/END_EVENT_TABLE宏和相关EVT_BUTTONEVT_CHECKBOX(...,EVT_SIZEEVT_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宏是否未(错误地(用于按钮。 如果是,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代码是开放的,并且记录得很好,所以看看他们是如何做到的。