GetClientRect GetWindowRect ScreenToClient ClientToScreen 通俗讲解~
CRect rect ;
1.GetClientRect(rect) 将调用此函数的类的 相对于用户区左上角的 矩形坐标 赋给rect
2.GetWindowRect(rect) 将调用此函数的类的 相对于屏幕左上角的 矩形坐标 赋给rect
ps. 这里参数要使用LPRECT的,即指向rect的指针,这里直接使用rect是因为他被重载了。
例1:(假设窗口长200(水平方向), 宽100, 客户区长180,宽90)
void CWnd::Example() { CRect rect ;
//若此时窗口在屏幕左上角, 则rect的top 跟 left 一定为0 , bottom 为 100, right 为200
//若距离屏幕左上角水平距离多x像素, 垂直多y像素, 则rect top = y, left = x, bottom = 100+y, right = 200+x ;
GetWindowRect(rect) ;
//窗口的客户区一般是除掉菜单栏,走右两边也稍稍比窗口窄一点, 你可以想象你的浏览器是一个窗口,那么客户区就等于去掉上面的导航栏和标签页,以及左右的滚动条。。
//现假设导航条宽10像素, 右边滚动条长(水平方向)5像素
//若此时窗口在屏幕左上角, 则rect的top = 0 left = 0 , bottom = 90, right = 180 (因为他是以客户区的左上角为顶点的,
所以不用理会导航条的宽度。客户区不包括导航条)
//窗口在哪个位置, 其实rect都不会变的。。因为客户区左上角也随着窗口移动。。。
GetClientRect(rect) ;
}
例2:
CStatic::Example() { CWnd *pParent = GetParent(); if (pParent) { pParent->ScreenToClient(rect); } }
首先我们要知道static控件的客户区只是他所在文字的矩形而已,他是不同于他父亲的客户区的。。。
这里static是窗口里面一个控件,因为ScreenToClient是他的父亲窗口调用的,所以若控件处于
rect 的值等于这个控件里窗口客户区的距离。。。有点像这个网页上“推荐”这个按钮离 屏幕左上角垂直距离加上导航栏的那个点 的距离
例3:
CStatic::Example2()
{
CRect rect ;
ScreenToClient(rect) ;
}
这里是控件调用的ScreenToClient函数, 所以rect的值是距离其所在文字的矩形, 则top 跟 left 都为0, right 和 bottom 随字体大小变化
例4:
CStatic::Example3()
{
CRect rect ;
//以下两个操作共同得到的矩形 与 GetWindowRect得到矩形相等
GetClientRect(rect) ;
ClientToScreen(rect) ;
//以下两个操作共同得到的矩形 与 GetClientRect得到矩形相等
GetWindowRect(rect) ;
ScreenToClient(rect) ;
}
这是我以下研究得到的成果。。。。 写下来分享给更多人!