Как расположить диалоговое окно в центре при
помощи 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;
}
|