如何在窗口上移动客户区的起始坐标?

时间:2015-12-29 01:21:59

标签: c++ winapi mfc aero dwm

我已经在下面的文章中评论过使用DWM绘制自定义框架区域。 Custom Window Frame Using DWM 删除标准帧后,帧中不存在非客户区域。

lboSelectedMtrl

因为整个窗口都是客户端区域,所以我必须调整框架的UI控件位置,但我不知道如何处理这个问题。 例如,在删除非客户端部分之前,应将红色矩形(所有UI组件)下移到客户区的原始坐标中。

enter image description here

1 个答案:

答案 0 :(得分:2)

CWnd::GetWindowRect为您提供屏幕上窗口的矩形。标题,边框和滚动条的尺寸(如果存在)包括在内。

CWnd::GetClientRect为您提供窗口的客户端rectangel。左侧和顶部成员将为0.右侧和底部成员将包含窗口的宽度和高度。

CWnd::ScreenToClientCWnd::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;
}