WndProc永远不会收到任何WM_COMMAND消息?

时间:2013-01-05 21:26:33

标签: c++ winapi frameworks

我正在Win32上创建一个简单的框架,我似乎无法捕获任何WM_COMMAND消息。我将通过WndProc传递的所有消息打印到输出控制台,并且没有WM_COMMAND条消息。我的程序包含一个窗口和一个编辑框(带有“编辑”类)。

这是我的临时消息循环(仅用于测试):

MSG msg;
BOOL ret;
while( ( ret = ::GetMessage( &msg, NULL, 0, 0 ) ) > 0 )
{
    if(msg.hwnd == NULL)
        continue;
    else if(ret == -1)
        break;
    else {
        ::TranslateMessage( &msg );
        ::DispatchMessage( &msg );
    }
}

这是WndProc:

LRESULT CALLBACK Win32Base::GlobalWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    Win32Base *pWindow;

    pWindow = reinterpret_cast<Win32Base*>( GetWindowLong( hWnd, GWL_USERDATA ) );
    if( pWindow ) {
        MSG msgdata;
        msgdata.hwnd = hWnd;
        msgdata.message = msg;
        msgdata.wParam = wParam;
        msgdata.lParam = lParam;

        return pWindow->OnMessage( msgdata );
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

我也是编辑框的子类。我可以捕获它的WM_CHAR消息等,但没有WM_COMMAND消息(但是,它们不应该在那里,我不认为)。

我觉得这个问题可能与我处理育儿方式有关。我添加了动态更改Windows父级,并且在创建控件时,有可能它还没有父级。因此,如果我使用WS_CHILD创建控件,则会导致错误,因为没有父级。因此,当我分配父项时,我还附加WS_CHILD样式(或者删除它,如果我删除父项)。这是一个好习惯吗?也许它可能阻止主窗口接收编辑框的WM_COMMAND消息?

此外,当我输入时,编辑框不会重新绘制,我必须强制重绘,这非常慢......

1 个答案:

答案 0 :(得分:3)

编辑控件在创建父窗口时会缓存它,并且永远不会更新它,因此即使您重新编辑控件,它仍然会向原始父控件发送通知消息。

一种解决方案是创建一个虚拟的“包装器”窗口类,它承载编辑控件,并将编辑控件发送的通知消息转发给其父控件。