我正在一个Windows应用程序上工作,在该应用程序中我实现了整个事件循环以及所有类似我自己的事情(这是有原因的)。在一个地方,显示一个窗口后,我需要执行一些代码。通常,在创建窗口时,当收到WM_CREATE消息时,我会进行一些初始化。仅在显示窗口之前发送WM_SHOWWINDOW。但是,我需要在第一次显示窗口后立即执行一些代码。在显示窗口之后,我似乎找不到发送的通知消息。可能是没有一个吗?
当然,我可以保留一个布尔值-FirstRun-指示是否执行了我的逻辑,然后在收到WM_ACTIVATE时执行代码,前提是布尔值是TRUE,然后将FirstRun设置为FALSE,这样代码就不会下次收到WM_ACTIVATE时执行,但这对我来说似乎有点不自然。
自从我在这个级别上进行win32编程以来已经有很多年了,所以记不清很多。这里最好的方法是什么?
没有特殊通知,但是在许多情况下,您可以使用此技巧:
LRESULT CALLBACK MainWndProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam) // second message parameter
{
switch (uMsg)
{
case WM_USER + 100:
//window is just displayed, do some actions
return DefWindowProc(hwnd, uMsg, wParam, lParam);
case WM_CREATE:
PostMessage(hwnd, WM_USER + 100, 0, 0);
return DefWindowProc(hwnd, uMsg, wParam, lParam);
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
没有一个,因为这就是WM_SHOWWINDOW的目的。该消息传递到默认消息处理过程后,将显示该窗口。您可以做的最好的事情是通过某种计时器用IsWindowVisible进行轮询。
您的程序设计似乎有缺陷,尽管必须依靠这样的东西。您想做什么?
只要您实现整个事件循环以及您自己的所有事情,就可以像这样直接在WinMain()中进行处理:
HWND hWnd = CreateWindow(...);
if (!hWnd) return 0;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
OnWindowJustDisplayed(); // here
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}