gpt4 book ai didi

c++ - 如何移动窗口客户区的起始坐标?

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:27 25 4
gpt4 key购买 nike

我已引用以下文章使用 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控件位置,但我不知道如何处理这个问题。例如,下面的红色矩形(所有 UI 组件)应该在移除非客户部分之前移动到客户区域的原始坐标。

enter image description here

最佳答案

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

CWnd::GetClientRect 为您提供窗口的客户端矩形。左侧和顶部成员将为 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;
}

关于c++ - 如何移动窗口客户区的起始坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com