0

我正在开发一个 Windows 应用程序,我自己正在实现整个事件循环和类似的一切(这是有原因的)。在一个地方,我需要在显示一个窗口后执行一些代码。通常,当创建窗口时,我会在收到 WM_CREATE 消息时进行一些初始化。WM_SHOWWINDOW 在窗口显示之前发送。但是,我需要在第一次显示窗口后立即执行一些代码。在显示窗口后,我似乎找不到发送的通知消息。难道没有一个吗?

当然,我可以保留一个布尔值 - FirstRun - 表示我是否已经执行了我的逻辑,然后在收到 WM_ACTIVATE 时执行代码,前提是布尔值为 TRUE,然后将 FirstRun 设置为 FALSE,这样代码就不会执行下次我收到 WM_ACTIVATE,但这对我来说似乎有些不自然。

自从我在这个级别上进行 win32 编程以来已经有很多年了,所以我记不太清了。这里最好的方法是什么?

4

3 回答 3

4

没有特别的通知,但在很多情况下你可以使用这个技巧:

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;
}
于 2011-09-20T13:45:50.557 回答
0

没有,因为这就是 WM_SHOWWINDOW 的用途。一旦该消息被传递到默认消息处理过程,将显示该窗口。您可以做的最好的事情是通过某种计时器使用IsWindowVisible进行轮询。

尽管必须依赖这样的东西,但您的程序设计似乎有缺陷。你想做什么?

于 2011-09-20T12:28:44.007 回答
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);
}
于 2020-01-10T20:17:43.367 回答