我在对话框 中加了一个Edit和按钮,然后对应的定义了一个变量。下面是按下按钮后的动作。
这段代码应该没有改动Edit的位置吧?但实际是变化了,看看lrt的值就知道了。实在不知是为什么?void CMoveCtrlDlg::OnOK() 
{
// TODO: Add extra validation here
CRect lrt; m_edit.GetWindowRect(lrt);
m_edit.MoveWindow(&lrt,TRUE);
m_edit.GetWindowRect(lrt);// CDialog::OnOK();
}

解决方案 »

  1.   

    控件坐标有两个,一个是在桌面中的坐标,叫屏幕坐标(Window)。
    一个是在容器(所在窗体)中的坐标,叫客户区坐标(Client)。GetWindowRect 取得的是屏幕坐标,
    MoveWindow是按客户区坐标来操作的,所以先得将
    屏幕坐标转换为客户区坐标。

    m_edit.MoveWindow(&lrt,TRUE);
    前加上
    ScreenToClient(lrt);
      

  2.   

    void CMoveCtrlDlg::OnOK() 
    {
    // TODO: Add extra validation here
    CRect lrt;//m_edit.GetWindowRect(lrt);把这一行改成下面的一行
             m_edit.GetClientRect(&lrt) ;
    m_edit.MoveWindow(&lrt,TRUE);
    m_edit.GetWindowRect(lrt);// CDialog::OnOK();
    }
      

  3.   

    CWnd::GetWindowRect
    返回值是一个指向CRect对象或RECT结构,用于接收左上角和右下角的屏幕坐标
    这个函数将CWnd对象的边界矩形的大小拷贝到lpRect所指向的结构中。大小是用相对于显示器屏幕左上角的屏幕坐标给出的,其中包括了标题条,边框和滚动条的大小,如果有的话。MoveWindow的参数对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。 而你的情况正好是一个子对象,你可以试试对一个顶层窗口进行同样的操作。
      

  4.   

    TO lianglp() :位置还是变动了。
      

  5.   

    谢谢各位,搞定了。给分了!void CMoveCtrlDlg::OnOK() 
    {
    // TODO: Add extra validation here
    CRect lrt;
    //
    m_edit.GetWindowRect(lrt);    //得到控件在屏幕坐标
    this->ScreenToClient(&lrt);   //将屏幕坐标转换成客户区坐标 lrt1.left += 50;
    lrt1.top += 20;
    lrt1.right += 50;
    lrt1.bottom += 20; m_edit.MoveWindow(&lrt1,TRUE);  //在客户区坐标内移动// CDialog::OnOK();
    }
      

  6.   

    要么就
    void CMoveCtrlDlg::OnOK() 
    {
    // TODO: Add extra validation here
    CRect lrt;         m_edit.GetClientRect(&lrt) ;
    m_edit.MoveWindow(&lrt,TRUE);
    m_edit.GetClientRect(lrt);// CDialog::OnOK();
    }要么就
    void CMoveCtrlDlg::OnOK() 
    {
    // TODO: Add extra validation here
    CRect lrt;         m_edit.GetWindowRect(&lrt) ;
    m_edit.MoveWindow(&lrt,TRUE);
    ScreenToClient(&lrt);
    m_edit.GetWindowRect(&lrt);// CDialog::OnOK();
    }
      

  7.   

    lrt1.left += 50;
    lrt1.top += 20;
    lrt1.right += 50;
    lrt1.bottom += 20;这段代码不好。
      

  8.   

    本来我已在给分了,只好再等等!等pomelowu(羽战士) 的建议。
      

  9.   

    就是这个:
    void CMoveCtrlDlg::OnOK() 
    {
    // TODO: Add extra validation here
    CRect lrt;         m_edit.GetClientRect(&lrt) ;
    m_edit.MoveWindow(&lrt,TRUE);
    m_edit.GetClientRect(lrt);// CDialog::OnOK();
    }
      

  10.   

    void CMoveCtrlDlg::OnOK() 
    {
    // TODO: Add extra validation here
    CRect lrt;         m_edit.GetWindowRect(&lrt) ;
    m_edit.ScreenToClient(&lrt);
    m_edit.MoveWindow(&lrt,TRUE);
    m_edit.GetWindowRect(&lrt);// CDialog::OnOK();
    }这段代码会和上面的代码有2个像素的差距(边框?)另外,分都给楼上的吧。我只是觉得
    lrt1.left += 50;
    lrt1.top += 20;
    lrt1.right += 50;
    lrt1.bottom += 20;这段代码不好,如果你移动了这个Edit框的位置,难道还要到源程序这里来修改这些20、50的?不利于维护地说~~