将消息从子类传递到原始WndProc

时间:2008-10-21 21:19:57

标签: c user-interface winapi

我一直在阅读有关子类化的MSDN文档,并且我已成功处理子类中的事件

我的问题是将邮件传递回原始的WndProc。

例如,如果我有一个窗口,带有子类别的组框控件和一个按钮作为该组框的子项,我想在原始窗口过程中处理按钮事件,而不是子类化的组框过程。 / p>

基本上,我想要一个空的子类过程:

LRESULT FAR PASCAL SubClassFunc(HWND hwnd,
                        UINT uMsg,
                WPARAM wParam,
                LPARAM lParam)
{
    return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
}

oldProc是:

FARPROC oldProc = (FARPROC)SetClassLong(group_box, GCL_WDPROC, (DWORD)SubCLassFunc);

窗口和组框和按钮的位置是:

HWND window = CreateWindowEx(
    WS_EX_WINDOWEDGE, 
    appname,
    TEXT("Subclass Test"),
    WS_VISIBLE |WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    300,
    400,
    NULL,
    NULL,
    hInstance,
    0);

HWND group_box = CreateWindowEx(
    0,
    TEXT("BUTTON"),
    TEXT("Group Box"),
    WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
    8,
    8,
    275,
    350,
    window,
    NULL,
    hInstance,
    0);

HWND push_button = CreateWindowEx(
    0,
    TEXT("BUTTON"),
    TEXT("Push Button"),
    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_VCENTER,
    50,
    100,
    100,
    25,
    group_box,
    (HMENU)PUSH_BUTTON,
    hInstance,
    0);

我可以处理SubClassFunc中的按钮事件,但我想要做的是将它们传递回窗口WndProc。似乎CallWindowProc没有这样做,或者我在CallWindowProc的工作方式上可能完全错误。

2 个答案:

答案 0 :(得分:4)

按钮通知将发送到按钮的父级,即组框。由于您已对子组进行了子类化,因此SubClassFunc会收到这些消息,然后使用CallWindowProc将这些消息传递给组合框的原始窗口过程。

如果您希望按钮通知转到父窗口(即代码中的window),您可以将按钮的父级设置为window而不是group_box,或者使用PostMessage内的SubClassFunc将消息(WM_COMMANDWM_NOTIFY视情况而定)发布到window

此外,我发现您正在使用SetClassLong来设置窗口过程。这样做是替换整个BUTTON类的窗口过程,但仅适用于随后创建的窗口。在调用BUTTON之前创建的任何SetClassLong窗口都不会被子类化。您可能需要考虑使用SetWindowLong来子类化单个窗口而不是整个类。

编辑:组框的原始窗口过程不会向其父级发送WM_COMMAND个消息。 Charles Petzold的Programming Windows书中解释了这一点:

  

具有BS_GROUPBOX样式的组框在按钮类中是一个奇怪的东西。它既不处理鼠标或键盘输入,也不向其父级发送WM_COMMAND消息。

即使您没有对组框进行子类化,您也会发现按钮通知无法通过window

我希望这有帮助!

答案 1 :(得分:0)

我怀疑如果你一起删除子类,按钮事件仍然不会像你期望的那样到达原始窗口过程。

由于您的子类过程只是调用 CallWindowProc ,因此窗口实际上不是子类。

我的建议是使用 Spy ++ 工具查看哪个窗口获取按钮事件消息。

Win32编程的一个更难的方面是确定哪个窗口获取哪个消息,而 Spy ++ 在找出这些信息时是非常宝贵的。