CWnd *pWnd;
pWnd=GetDlgItem(IDC_LIST1);
if(nType==1)
return;
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
//ScreenToClient(&m_rect);
rect.left=rect.left*cx*1.0/m_rect.Width();
rect.right=rect.right*cx*1.0/m_rect.Width();
rect.top=rect.top*cy*1.0/m_rect.Height();
rect.bottom=rect.bottom*cy*1.0/m_rect.Height();
pWnd->MoveWindow(rect);
}
GetClientRect(&m_rect);
在父窗口OnSize()函数添加这些代码后,父窗口的变化后子控件虽然变化,但是变着变着就走形了。

解决方案 »

  1.   

    你的算法有问题,子控件相对于父窗口的位置和大小应该是由控件左上角的坐标以及控件自身相对的长宽来控制,看你的意思cx是控件初始长,cy是控件初始宽.还需要左上角的初始坐标来参与计算.
      

  2.   

    cx,cy是父窗口变化后的长和宽啊!
      

  3.   

    直接在onsize中使用cxcy
    就可以!
      

  4.   

    cx,cy不是父窗口变化后的大小吗?
      

  5.   


    或者这样试试
    rect.left=(初始时的rect).left*cx*1.0/(初始时m_rect).Width();
    rect.right=(初始时的rect).right*cx*1.0/(初始时m_rect).Width();
    rect.top=(初始时的rect).top*cy*1.0/(初始时m_rect).Height();
    rect.bottom=(初始时的rect).bottom*cy*1.0/(初始时m_rect).Height();
    变的只有cx和cy,rect和m_rect都是采用第一次时的值
      

  6.   

    我就是在OnSize里面使用的啊!
      

  7.   

    我一般都是只取一次初值,也就是在OnInitDialog里面记下窗口的rect,以及控件的左上角坐标和宽高,后面的onsize就每次都用这个去计算,不要每次都和上一次的值进行计算,这样的误差就会累积.
      

  8.   

    我让左上角的坐标固定了,但是还是会有问题。
    就在OnInitDialog里面取一次,OnSize里面用初始值来计算,不要让误差累积.
      

  9.   

           用到两个函数:
            afx_msg void OnSize(UINT nType, int cx, int cy);
    CRect m_rect;//用于保存对话框大小变化前的大小
    void  ChangeSize(UINT nID,int x,int y);

    在初始化函数OnInitDialog()中,加上这句:
    //获取对话框创建时的大小:
    GetClientRect(&m_rect);void ...Dlg::OnSize(UINT nType, int cx, int cy)
    {
    CDialogEx::OnSize(nType, cx, cy);
     // UPDATE_EASYSIZE;
    // TODO: 在此处添加消息处理程序代码
    if(nType != SIZE_MINIMIZED )
    {   //ECUType 组的放缩
    ChangeSize(IDC_STATIC_TYPE,cx,cy);
           ..........
                           ..........
                   GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小,否则无法还原控件原始位置
            }
    }
    void  ....Dlg::ChangeSize(UINT nID,int x,int y)
    {
    CWnd *pWnd;
    pWnd = GetDlgItem(nID);                       //获取控件句柄
    if(pWnd)                //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    {
      CRect rect;                                //获取控件变化前大小
    pWnd->GetWindowRect(&rect);
    ScreenToClient(&rect);                //将控件大小转换为在对话框中的区域坐标

    // cx/m_rect.Width()为对话框在横向的变化比例
                                   
    rect.left = rect.left * x/ m_rect.Width();      /**//////调整控件大小
    rect.right = rect.right* x/ m_rect.Width();
    rect.top = rect.top * y/ m_rect.Height();
    rect.bottom= rect.bottom* y/ m_rect.Height();
    pWnd->MoveWindow(rect);                         //设置控件大小
    }
    }
      

  10.   


    里面的IDC_STATIC_TYPE是啥?
      

  11.   


    相当于你程序里的IDC_LIST1,好像是差不多,只是我的没有乘以1.0,还有我的多了一句:CDialogEx::OnSize(nType, cx, cy);和  一个判断if(nType != SIZE_MINIMIZED );我也不是什么高手,不过我用这个没有问题,所以贴出来,希望可以帮到你点什么