CRect Rect1;
GetWindowRect(&Rect1); //获得主窗口的位置
int nCaption = ::GetSystemMetrics(SM_CYCAPTION);
int nXEdge = ::GetSystemMetrics(SM_CXEDGE);
int nYEdge = ::GetSystemMetrics(SM_CYEDGE);
CRect Rect2;
GetDlgItem(IDC_POS)->GetWindowRect(&Rect2); //获得框架的位置
Rect1.top=Rect1.top+nCaption+nYEdge; //相对坐标
Rect1.left=Rect1.left+2*nXEdge;
//计算机位置
rectPage.top=Rect2.top-Rect1.top;
rectPage.left=Rect2.left-Rect1.left;
rectPage.bottom=Rect2.bottom-Rect1.top;
rectPage.right=Rect2.right-Rect1.left;rectPage为需要显示控件的窗口
我的问题是:
Rect1.left=Rect1.left+2*nXEdge,这里为什么要乘2?
rectPage的位置为什么是用Rect2来减Rect1?这是什么意思?

解决方案 »

  1.   

    该程序的详细介绍在这里
    http://www.vckbase.com/document/viewdoc/?id=330
      

  2.   

    把rectPage的窗口重叠到IDC_POS的窗口,是以Rect2来定位对齐。
    GetWindowRect获得的是屏幕坐标,设置子窗口位置需要相对坐标,因此需要用Rect2来减Rect1。
    Rect1.left=Rect1.left+2*nXEdge,这样的效果就是rectPage的窗口宽度比IDC_POS的窗口多了一个窗口边框的尺寸。
      

  3.   

    其实就是计算page在父窗口的client坐标,然后用MoveWindow来定位
    1. Rect1.left=Rect1.left+2*nXEdge
    之所以多加一个nXEdge是因为要去掉page父窗口本身的边框,page父窗口是对话框的一个控件Rect1.top=Rect1.top+nCaption+nYEdge也是一个道理
    最后得到的Rect1是page父窗口的client区域的屏幕坐标
    2.IDC_POS是用来做page定位的
    rectPage是IDC_POS在page父窗口的client坐标。
      

  4.   

    其实用下面的代码也可以
    CRect Rect2;
    GetDlgItem(IDC_POS)->GetWindowRect(&Rect2); //获得框架的位置CWnd* pParent = m_page->GetParent(); //m_page是要定位的控件
    pParnet->ScreenToClient(&Rect2);rectPage = Rect2;