概述
函数说明
GetWindowRect
此函数是获取窗体或者控件在屏幕坐标系下的坐标。
若此函数用于窗体初始化函数中,原点位于窗体的左上角;
若此函数在窗体初始化完成之后使用,原点位于屏幕的左上角。
ScreenToClient
此函数是将屏幕坐标转化为客户区坐标。
GetClientRect
此函数是获取窗体或者控件客户区的大小,一般来说,针对窗体还是控件,其获取的Left、Top参数均为0;
ClientToScreen
此函数是将客户区坐标转化为屏幕坐标
MoveWindow
针对窗体,使用屏幕坐标,若窗体存在父窗体,则使用父窗体客户区坐标;
针对控件,使用窗体客户区坐标。
针对窗体进行测试
CRect rectClientRect;
GetClientRect(rectClientRect); //top=0 botton=397 left=0 right=564
CRect rectClientToScreen;
rectClientToScreen = rectClientRect;
ClientToScreen(rectClientToScreen); //top=26 botton=423 left=3 right=567
CRect rectWinRect;
GetWindowRect(rectWinRect); //top=0 botton=426 left=0 right=570
CRect rectScreenToClient;
rectScreenToClient = rectWinRect;
ScreenToClient(rectScreenToClient); //top=-26 botton=400 left=-3 right=567
int nTitltHeight = GetSystemMetrics(SM_CYCAPTION); //标题栏高度23
MoveWindow(rectWinRect.left,rectWinRect.top,rectWinRect.Width(),rectWinRect.Height());//窗体不动
通过测试结果也可以证明,该对话框上下边框相等,均为3。
其中左右边框也为3。
在移动控件位置时注意事项
若针对控件使用GetWindowRect,则获取的是控件的客户区的大小。
若要获取控件位于客户区的坐标,则应该使用GetWindowRect,再使用ScreenToClient。
CRect rectButtonWinRect;
GetDlgItem(IDC_BUTTON1)->GetClientRect(rectButtonWinRect);//top=0 botton=67 left=0 right=161
CRect rectButtonClientRect;
GetDlgItem(IDC_BUTTON1)->GetWindowRect(rectButtonClientRect);//top=49 botton=116 left=44 right=205
ScreenToClient(rectButtonClientRect);
GetDlgItem(IDC_BUTTON1)->MoveWindow(rectButtonClientRect);//控件处于原位置不动
List Control控件测试
CRect rectListWinRect;
GetDlgItem(IDC_LIST1)->GetWindowRect(rectListWinRect); //top=159 botton=409 left=47 right=241
CRect rectListClientRect;
GetDlgItem(IDC_LIST1)->GetClientRect(rectListClientRect); //top=0 botton=246 left=0 right=190
其中
rectListWinRect.bottom-rectListWinRect.top != rectListClientRect.bottom - rectListClientRect.top;
这是由于List Control是具有边框的。
GetWindowRect获取的是整个控件相对于原点的位置;
GetClientRect获取的是控件客户区的位置。
弹窗测试1(GetWindowRect)
在Test窗体上点击Button1,弹出Dialog窗体。
在Dialog的初始化窗体中执行如下代码
CRect rectButtonWin;
GetDlgItem(IDC_BUTTON2)->GetWindowRect(rectButtonWin);//top=431 botton=493 left=740 right=887
很显然,得到的区域并不是以Dialog窗体左上角为坐标原点。
这是由于父窗体已经存在,此时的GetWindowRect是以屏幕左上角点为坐标原点。
弹窗测试2(MoveWindow)
点击“弹窗”按钮,弹出Dialog1对话框。
void CTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CDlg1* dlg1 = new CDlg1();
dlg1->Create(IDD_DIALOG1,this);
CRect rec1;
dlg1->GetWindowRect(rec1);
dlg1->MoveWindow(40,50,rec1.Width(),rec1.Height());
dlg1->ShowWindow(SW_SHOW);
}
若对话框属性设置为Child,MoveWindow的坐标参数为Test窗体的客户区坐标。
若对话框属性设置为Pop, MoveWindow的坐标参数为屏幕坐标。
参考博客
最后
以上就是笑点低萝莉为你收集整理的GetClientRect、ScreenToClient、GetWindowRect、ClientToScreen、MoveWindow用法总结的全部内容,希望文章能够帮你解决GetClientRect、ScreenToClient、GetWindowRect、ClientToScreen、MoveWindow用法总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复