Win32子类窗口消息

时间:2013-03-02 18:31:47

标签: c++ winapi subclassing

我在Win32应用程序中有一个带有按钮窗口的静态窗口,我将按钮子类化,所以我用单个“MessageProc”来处理它的消息。

void MyProgram::Initialize(WNDPROC messageProc)
{
    //Here I create a bunch of windows
    _resourceWindow = CreateWindow("STATIC", "Resources", WS_CHILD | WS_VISIBLE | WS_SIZEBOX, 5, 5, 200, 600, 0, 0, _mainInstance, NULL);
    //The child button
    _resourceAddButton = CreateWindow("BUTTON", "Add", WS_CHILD | WS_VISIBLE, 5, 20, 50, 20, _resourceWindow, 0, _mainInstance, NULL);

    _resourceAddButtonWndProc = (WNDPROC)SetWindowLongPtr(_resourceAddButton, GWLP_WNDPROC, (WNDPROC)messageProc);
    //Messages from this button are sent to messageProc now
}

void MyProgram::SubclassesProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_PAINT:
        {
            if(hWnd == _resourceAddButton) //I have more than one child button so I'll have to do this one by one right?
            {
                CallWindowProc(_resourceAddButtonWndProc, hWnd, uMsg, wParam, lParam);
            }
        }
    }
}

这个“SubclassesProc”在我的“messageProc”函数的默认部分中被调用。

现在的方式,我的按钮根本没有获得“点击”,我点击但没有任何反应(它没有直观改变,也没有调用WM_COMMAND)。 我猜这是因为现在来自该Button的所有消息都由messageProc函数处理,这导致一些消息阻塞...例如,Button控件中的WM_LBUTTONDOWN永远不会被调用,因为我已经有了:

switch(uMsg)
{
    case WM_LBUTTONDOWN:
    {
        //I'm doing something else
        break;
    }
    //bunch of other commands
    default:
    {
        myProgram.SubclassesProc(hWnd, uMsg, wParam, lParam);
        break;
    }
}

因此,不会调用带有WM_LBUTTONDOWN的SubclassesProc,并且无法单击Button,因此不会触发WM_COMMAND。

处理此问题的正确方法是什么?

现在我正在考虑重写messageProc函数,但我必须考虑几乎每个用户输入消息中的每个子类窗口......或者只是忘记子类化。

0 个答案:

没有答案