Выполнить код после отображения окна - PullRequest
0 голосов
/ 20 сентября 2011

Я работаю над приложением Windows, в котором я сам реализую весь цикл обработки событий и все такое (есть причина для этого).В одном месте мне нужно выполнить какой-то код ПОСЛЕ того, как появится окно.Обычно, когда окно создается, я делаю некоторую инициализацию, когда получено сообщение WM_CREATE.WM_SHOWWINDOW отправляется только ДО отображения окна.Однако мне нужно, чтобы какой-то код выполнялся правильно ПОСЛЕ того, как окно отображается впервые.Кажется, я не могу найти уведомление, отправленное ПОСЛЕ отображения окна.Может ли быть, что его нет?

Конечно, я могу сохранить логическое значение - FirstRun - указывающее, выполнила ли я свою логику, и затем выполнить код при получении WM_ACTIVATE при условии, что логическое значениеTRUE, затем установите FirstRun в FALSE, чтобы код не выполнялся при следующем получении WM_ACTIVATE, но мне это кажется несколько неестественным.

Прошло много времени с тех пор, как я запрограммировал win32 на этом уровне, поэтомуне могу вспомнить многое из этого.Каков наилучший подход здесь?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Специальных уведомлений нет, но во многих случаях вы можете использовать этот трюк:

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 голосов
/ 20 сентября 2011

Нет ни одного, потому что это то, для чего предназначен WM_SHOWWINDOW.Как только это сообщение будет передано в процедуру обработки сообщений по умолчанию, появится окно.Лучшее, что вы можете сделать, это опросить IsWindowVisible через какой-то таймер.

Дизайн вашей программы кажется некорректным, хотя приходится полагаться на что-то подобное.Что ты пытаешься сделать?

...