我正在开发一个Windows应用程序,我正在实现整个事件循环以及我自己的一切(这是有原因的)。在一个地方,我需要在显示窗口后执行一些代码。通常,在创建窗口时,我会在收到WM_CREATE消息时进行初始化。 WM_SHOWWINDOW仅在显示窗口之前发送。但是,我需要在第一次显示窗口后立即执行一些代码。我似乎无法找到窗口显示后发送的通知消息。可能没有一个吗?
当然,我可以保留一个布尔值 - FirstRun - 指示我是否已经执行了我的逻辑,然后在收到WM_ACTIVATE时执行代码,前提是布尔值为TRUE,然后将FirstRun设置为FALSE,以便代码为我下次收到WM_ACTIVATE时没有执行,但这对我来说似乎有点不自然。
自从我在这个级别上进行win32编程以来已经很久了,所以不记得太多了。这里最好的方法是什么?
答案 0 :(得分:3)
没有特别的通知,但在很多情况下你可以使用这个技巧:
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;
}
答案 1 :(得分:0)
没有一个,因为这就是WM_SHOWWINDOW的用途。将该消息传递给默认消息处理过程后,将显示该窗口。您可以做的最好的事情是使用IsWindowVisible通过某种计时器进行投票。
你的程序设计似乎有缺陷,但必须依赖这样的东西。你想做什么?
答案 2 :(得分:0)
只要您实现整个事件循环以及您自己的所有事情,就可以像这样直接在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);
}