Я хочу получить cx и cy во время OnInitDialog CDialog.
Я могу сделать это с помощью следующего кода:
myDialog::OnInitDialog()
{
CRect rcWindow2;
this->GetWindowRect(rcWindow2);
CSize m_szMinimum = rcWindow2.Size();
int width = m_szMinimum.cx;
int height = m_szMinimum.cy;
}
Однако cx и cy в OnInitDialog не совпадают с cx и cy, которые попали в OnSize:
void myDialog::OnSize(UINT nType, int cx, int cy)
Из OnInitDialog: cx = 417, cy = 348
Из OnSize: cx = 401, cy = 310
похоже, может быть границы, но я не могу понять это.
Будем благодарны за предложения о том, как получить те же данные xy в OnInitDialog, что и в OnSize.
Наследование:
myDialog -> CDialog -> CWnd
GetWindowRect
возвращает верхнюю левую позицию окна в экранных координатах. Ширина и высота окна включает толщину границы и высоту заголовка.
GetClientRect
всегда возвращает ноль для верхнего левого угла. Ширина и высота те же значения, что и OnSize
,
Пока мы находимся на предмете, это может также запутать, когда речь идет о перемещении дочерних окон. Так как SetWindowPos
нужны координаты клиента, а GetWindowRect
возвращает только координаты экрана. Преобразование экрана / клиента будет необходимо так:
void GetWndRect(CRect &rc, HWND child, HWND parent)
{
GetWindowRect(child, &rc);
CPoint offset(0, 0);
ClientToScreen(parent, &offset);
rc.OffsetRect(-offset);
}
Теперь мы можем переместить кнопку в диалоговом окне:
CWnd *child = GetDlgItem(IDOK);
CRect rc;
GetWndRect(rc, child->m_hWnd, m_hWnd);
rc.OffsetRect(-5, -5);
child->SetWindowPos(0, rc.left, rc.top, 0, 0, SWP_NOSIZE);