Как расположить диалоговое окно в центре при помощи 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;
}  
 
« Предыдущая статья   Следующая статья »