0

我正在 Win32 上创建一个简单的框架,但我似乎无法捕捉到任何WM_COMMAND消息。我将通过 WndProc 的所有消息打印到输出控制台,但没有WM_COMMAND消息。我的程序由一个窗口和一个编辑框(带有“EDIT”类)组成。

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

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 消息?

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

4

1 回答 1

3

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

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

于 2013-01-05T21:46:21.353 回答