我正在 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 消息?
另外,当我输入时,编辑框不会重新绘制,我必须强制它重新绘制,这非常慢......