15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как расположить диалоговое окно в центре при помощи MFC

Иногда, в приложении MFC бывает необходимо автоматически отцентровать диалоговое окно относителько родительского окна, создавшего его.

Так же необходимо предусмотреть случай, когда главное окно не существует (чтобы не передать в качестве дескриптора главного NULL). При этом необходимо добавить дополнительный код центрирования диалогового окна, чтобы обеспечить центрирование как относительно десктопа так и относительно родительского окна.

Пример кода

   /*
    * Требуемые опции компилятора: (Стандартные требования Windows)
    */ 

   void CMyDialog::CenterDialog(CWnd *MyDialogPtr)
   {
      CPoint   Point;
      CRect    DialogRect;
      CRect    ParentRect;
      int      nWidth;
      int      nHeight;
      CWnd     *DesktopWindow = NULL;
      CWnd     *MainWindow;

      // Получаем размер диалогового окна.
      MyDialogPtr->GetWindowRect(DialogRect);

      // Получаем главное окно.
      MainWindow = AfxGetApp()->m_pMainWnd;

      // Определяем, существует ли главное окно. Это может быть полезно,
      // когда приложение создаёт диалоговое окно перед созданием
      // главного окна. Если оно существует, запрашиваем его размер,
      // чтобы отцентрировать диалог относительно главного окна.
      if (MainWindow != NULL)
         MainWindow->GetClientRect(ParentRect);
      // Если главное окно не существует, то центрируем относительно
      // окна десктопа.
      else
      {
         DesktopWindow = MyDialogPtr->GetDesktopWindow();
         DesktopWindow->GetWindowRect(ParentRect);
      }

      // Вычисляем высоту и ширину для MoveWindow().
      nWidth = DialogRect.Width();
      nHeight = DialogRect.Height();

      // Находим точку центра и преобразуем в координаты экрана.
      Point.x = ParentRect.Width() / 2;
      Point.y = ParentRect.Height() / 2;
      if (MainWindow)
         MainWindow->ClientToScreen(&Point);
      else
         DesktopWindow->ClientToScreen(&Point);

      // Вычисляем новые X, Y начальной точки.
      Point.x -= nWidth / 2;
      Point.y -= nHeight / 2;

      // Перемещаем окно.
      MyDialogPtr->MoveWindow(Point.x, Point.y, nWidth, nHeight, FALSE);
   }

   BOOL CMyDialog::OnInitDialog()
   {
      CDialog::OnInitDialog();

      // Удалите комментарий у 1 либо 2 в соответствие с версией
      // библиотеки MFC, которую Вы используете


      // 1. Вызов CenterDialog() для версии 1.0
      // CenterDialog(this);

      // 2. Вызов CenterWindow() для версий 2.0 и выше
      // CenterWindow();

      return TRUE;
   }