MFC - выполнить код сразу после отображения диалогового окна (.NET эквивалент Form.Shown)
Вопрос
Я делаю небольшие изменения в проекте C ++ MFC. Я являюсь разработчиком .NET, поэтому программирование для Windows является новым для меня.
Мне нужно запустить какой-то метод сразу после того, как CDialog будет полностью показан (нарисован) в первый раз, но только один раз.
Как я могу это сделать? В .NET я бы обработал событие Form.Shown .
Нужно ли обрабатывать какое-то сообщение? Который? Нужно ли переопределить какой-нибудь метод CDialog? Или нет легкого пути? Я думаю о том, чтобы обработать WM_ACTIVATE и затем использовать флаг, чтобы убедиться, что я вызываю другой метод только один раз.
Решение
Нашел ответ здесь: Ожидание появления диалогового окна отображается перед выполнением чего-либо
Short story:
INT_PTR CALLBACK
DlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch (uiMsg) {
case WM_INITDIALOG:
return TRUE;
case WM_WINDOWPOSCHANGED:
if ((((WINDOWPOS*)lParam)->flags & SWP_SHOWWINDOW) &&
!g_fShown) {
g_fShown = TRUE;
PostMessage(hwnd, WM_APP, 0, 0);
}
break;
case WM_APP:
MessageBox(hwnd,
IsWindowVisible(hwnd) ? TEXT("Visible")
: TEXT("Not Visible"),
TEXT("Title"), MB_OK);
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
}
return FALSE;
}
Если вы используете MFC, как я, вам нужно сопоставить WM_WINDOWPOSCHANGED, а затем использовать ON_MESSAGE для сопоставления WM_APP. См. эту статью CodeProject. для более подробной информации.
Другие советы
Другой подход, который я использовал с большим успехом несколько раз, - это использование таймера. Установите это на 10m0s. Он будет срабатывать только после отображения диалога. Р>
Ад поместил код в OnPaint () и бросил вызов в ваш класс. Мне тоже нравится таймер .. Хотя я обычно иду с 100 мс. В этих случаях я также перемещаю весь свой код инициализации из oninit. Просто для защиты от слишком большого количества обработки. Р>