почему cx / cy из GetWindowRect (rcWindow2) отличается от cx / cy, вводимой в OnSize?

Я хочу получить 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

1

Решение

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);
2

Другие решения


По вопросам рекламы [email protected]