MFC - выполнить код сразу после отображения диалогового окна (.NET эквивалент Form.Shown) - PullRequest
3 голосов
/ 06 ноября 2008

Я делаю небольшие изменения в проекте C ++ MFC. Я являюсь разработчиком .NET, поэтому программирование для Windows является новым для меня.

Мне нужно запустить какой-то метод сразу после того, как CDialog будет полностью показан (нарисован) в первый раз, но только один раз.

Как я могу это сделать? В .NET я бы обработал Form.Shown событие.

Мне нужно обработать какое-нибудь сообщение? Который? Нужно ли переопределить какой-нибудь метод CDialog? Или нет легкого пути? Я думаю об обработке WM_ACTIVATE, а затем об использовании флага, чтобы убедиться, что я вызываю другой метод только один раз.

Ответы [ 3 ]

3 голосов
/ 06 ноября 2008

Нашел ответ здесь: Ожидание отображения диалогового окна, прежде чем что-то делать

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 для получения более подробной информации.

0 голосов
/ 29 ноября 2008

Ад поместил код в OnPaint () и бросил вызов в ваш класс. Мне тоже нравится таймер .. Хотя я обычно иду с 100 мс. В этих случаях я также перемещаю весь свой код инициализации из oninit. Просто для защиты от слишком большого количества обработки.

0 голосов
/ 07 ноября 2008

Другой подход, который я использовал с большим успехом несколько раз, - это использование таймера. Установите это на 10m0s. Он будет срабатывать только после отображения диалога.

...