当前位置:编程学习 > 网站相关 >>

控件移动

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窗口。www.zzzyk.com
 
控件动态移动事例:
     int nOffY = 100;
 
     GetDlgItem(CtrlID)->GetWindowRect(rMove);
     rMove.top += nOffY;
     rMove.bottom += nOffY;
     ScreenToClient(rMove);
     GetDlgItem(CtrlID)->MoveWindow(rMove);
     GetDlgItem(CtrlID)->Invalidate();
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,