Как сместить начальные координаты клиентской области в окно?

Я ссылаюсь на статью ниже, чтобы нарисовать область рамки с DWM.
Пользовательская оконная рама с использованием DWM
После удаления стандартного кадра, не клиентская область не существует в кадре.

void CMainFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
int nTHight = 30; /*The title bar height*/
RECT * rc;
RECT aRect;
RECT bRect;
RECT bcRect;
if(bCalcValidRects == TRUE)
{
CopyRect(&aRect,&lpncsp->rgrc[1]);
CopyRect(&bRect,&lpncsp->rgrc[0]);
bcRect.left = bRect.left;
bcRect.top = bRect.top - nTHight;
bcRect.right = bRect.right;
bcRect.bottom = bRect.bottom;
CopyRect(&lpncsp->rgrc[0],&bcRect);
CopyRect(&lpncsp->rgrc[1],&bRect);
CopyRect(&lpncsp->rgrc[2],&aRect);
}
else
{
rc = (RECT *)lpncsp;
rc->left = rc->left;
rc->top = rc->top - nTHight;
rc->right = rc->right;
rc->bottom = rc->bottom;
}

CFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
}

Поскольку все окно является клиентской областью, я должен настроить расположение элемента управления UI для фрейма, но я не знаю, как справиться с этой проблемой.
Например, ниже красный прямоугольник (все компоненты пользовательского интерфейса) должен быть смещен в исходную координату клиентской области перед удалением не клиентской части.

введите описание изображения здесь

2

Решение

CWnd::GetWindowRect дает вам прямоугольник окна на экране. Размеры заголовка, границы и полос прокрутки, если они есть, включены.

CWnd::GetClientRect выдает клиенту прямоугольник окна. Левый и верхний элементы будут равны 0. Правый и нижний элементы будут содержать ширину и высоту окна.

CWnd::ScreenToClientа также CWnd::ClientToScreen рассчитать точку или прямоугольник из клиентской области, чтобы отобразить координаты и вернуться к экрану.

AdjustWindowRect вычисляет необходимый прямоугольник окна, основываясь на клиентском прямоугольнике окна.

Вот функция, которая вычисляет поля окна:

void CalculateWndMargin( const CWnd &wnd, int &leftM, int &rightM , int &topM, int &bottomM )
{
CRect wndRect;
wnd.GetWindowRect( wndRect );
CRect screenRect;
wnd.GetClientRect( screenRect );
wnd.ClientToScreen( screenRect );
leftM = screenRect.left - wndRect.left;
rightM = wndRect.right - screenRect.right;
topM = screenRect.top - wndRect.top;
bottomM = wndRect.bottom - screenRect.bottom;
}
2

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector