我正在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消息?
此外,当我输入时,编辑框不会重新绘制,我必须强制重绘,这非常慢......
答案 0 :(得分:3)
编辑控件在创建父窗口时会缓存它,并且永远不会更新它,因此即使您重新编辑控件,它仍然会向原始父控件发送通知消息。
一种解决方案是创建一个虚拟的“包装器”窗口类,它承载编辑控件,并将编辑控件发送的通知消息转发给其父控件。