显示窗口后执行代码

问题描述 投票:0回答:3

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

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

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

winapi event-loop
3个回答
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;
}

0
投票

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

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


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);
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.