2015-12-29 1 views
2

У меня есть ссылка ниже статьи, чтобы нарисовать пользовательскую область кадра с DWM. Custom Window Frame Using 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 для кадра, но я не знаю, как справиться с этой проблемой. Например, под красным прямоугольником (весь компонент пользовательского интерфейса) перед удалением части не клиент должен быть смещен в исходную координату клиентской области.

enter image description here

+0

Проверьте Приложение C этой страницы. Если вы просто позволяете DWM нарисовать стандартную подпись в своей клиентской области, вы можете использовать 'AdjustWindowRectEx()', чтобы получить то, что было бы первоначальным клиентом. – andlabs

ответ

1

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

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

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

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

Вот который calcualtes прекращение функции полей окна:

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; 
} 
Смежные вопросы