我在对话框 中加了一个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();
}
这段代码应该没有改动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();
}
一个是在容器(所在窗体)中的坐标,叫客户区坐标(Client)。GetWindowRect 取得的是屏幕坐标,
MoveWindow是按客户区坐标来操作的,所以先得将
屏幕坐标转换为客户区坐标。
在
m_edit.MoveWindow(&lrt,TRUE);
前加上
ScreenToClient(lrt);
{
// 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();
}
返回值是一个指向CRect对象或RECT结构,用于接收左上角和右下角的屏幕坐标
这个函数将CWnd对象的边界矩形的大小拷贝到lpRect所指向的结构中。大小是用相对于显示器屏幕左上角的屏幕坐标给出的,其中包括了标题条,边框和滚动条的大小,如果有的话。MoveWindow的参数对于顶层的CWnd对象,x和y参数是相对于屏幕的左上角的。对于子对象,它们是相对于父窗口客户区的左上角的。 而你的情况正好是一个子对象,你可以试试对一个顶层窗口进行同样的操作。
{
// 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();
}
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();
}
lrt1.top += 20;
lrt1.right += 50;
lrt1.bottom += 20;这段代码不好。
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();
}
{
// 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的?不利于维护地说~~