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

StackOverflow https://stackoverflow.com/questions/269462

  •  06-07-2019
  •  | 
  •  

Вопрос

Я делаю небольшие изменения в проекте 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. Просто для защиты от слишком большого количества обработки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top