GetClientRect,GetWindowRect,ClientToScreen,ScreenToClient这四个函数如何理解?

GetClientRect,GetWindowRect获得的Crect分别是相对什么来说的?还有其它能获得位置的函数吗?还有ClientToScreen,ScreenTo... GetClientRect,GetWindowRect获得的Crect分别是相对什么来说的?还有其它能获得位置的函数吗?还有ClientToScreen,ScreenToClient两个函数是怎么理解的,请举个例子说明下好吗?
我当前的问题是想在Ctabctrl控件的一页上放置一个对话框,如何才能把对话框移到刚好完美覆盖的地方?
还有我这个TAB控件的父窗口不是最大化的,是否还有区别的?
谢谢这位大哥的完整回答,辛苦了呵呵。。
可是我还是有些不明白,就如“它的大小就是整个窗口的大小。”这句话里的窗口是指TAB控件(TAB也是窗口)还是指他的父窗口?大哥能否留下E_MAIL以后多向你请教!
展开
 我来答
cmbird
2008-09-08 · TA获得超过576个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:302万
展开全部
GetClientRect的CRect是相对它的窗口的客户区的原点而言的,即它的左上角坐标总是(0,0),大小总是客户区的长宽。GetWindowRect得到的CRect则是相对于屏幕坐标而言的,它的左上角坐标就是窗口在屏幕上的左上角坐标,它的大小就是整个窗口的大小。
ClientToScreen,可以把一个CPoint对象或CRect对象的坐标从客户区坐标系(以客户区左上角为原点)变换为屏幕坐标系(以屏幕左上角为原点)。
如:
// 把对话框的大小变成客户区的大小
void CAboutDlg::OnButton1()
{
CRect myRect;
GetClientRect(&myRect);//取得客户区的大小

ClientToScreen(myRect);//转换为屏幕坐标
MoveWindow(myRect.left, myRect.top,
myRect.Width(), myRect.Height());//MoveWindow使用的是屏幕坐标
}

ScreenToClient,则可以把一个CPoint对象或CRect对象的坐标从屏幕坐标系变换为客户区坐标系。
例如:
CPoint pos( ::GetMessagePos() ); //::GetMessagePos() 得到发生事件时鼠标的屏幕坐标
ScreenToClient(&pos);//把它转换为客户区坐标以便随后在绘图时使用
...
使用以下代码,可以把对话框移到刚好覆盖的地方:
CRect rcTab; // 整个Tab
CRect rcItem; // Tab上方的按钮

// 取得并计算要移动的矩形框
m_tab1.GetWindowRect(&rcTab); // 屏幕坐标
ScreenToClient(rcTab); // 化成父窗口的客户区坐标
m_tab1.GetItemRect(0, &rcItem); // 取得Tab上方按钮的大小
rcTab.DeflateRect(0,rcItem.bottom+1,0,0); // 缩小Tab的矩形

// 把对话框移动到这个矩形框上
m_Page1->MoveWindow(rcTab); // 相对于父窗口的客户区移动

补充:
关于这些函数的最权威、最详细的描述,请参看MSDN。
GetClientRect(),GetWindowRect()这两个函数都是CWnd类的成员函数,或称为方法(Method)。所以调用它们得到的矩形都是属于调用它们的那个CWnd对象的窗口的,如m_tab1.GetWindowRect(&rcTab); 得到的矩形rcTab就是Tab控件的窗口大小和位置(屏幕坐标系)。"它的大小就是整个窗口的大小"这句话中说的窗口就是发出GetWindowRect()调用的这个CWnd窗口。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式