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

时间:2012-05-14 11:10:20

标签: c++ windows user-interface wxwidgets

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

动机:我正在更大的应用程序中重写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命令必须使其对程序的调试版本可见。

2 个答案:

答案 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代码是开放的,并且有很好的文档记录,所以看看它们是如何做到的。