最近经常要用到改变控件在对话框上的位置和大小,一直找不到有效的方法,查看了很多资料。这篇博文还算靠谱,转载到这里了。
-
void CmyqeDlg::OnSize(UINT nType, int cx, int cy)
-
{
-
CDialog::OnSize(nType, cx, cy);
-
if(nType!=SIZE_MINIMIZED)
-
{
-
if (me) // 判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
-
{
-
CRect rt;
-
me.GetWindowRect(&rt);
-
ScreenToClient(&rt);
-
me.MoveWindow(rt.left,rt.top,cx-rt.left*2,cy-rt.top-rt.left);
-
}
-
}
-
-
CWnd *pWnd;
-
pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号
-
void MoveWindow(int x,int y,int nWidth,int nHeight);
-
void MoveWindow(LPCRECT lpRect);
-
CWnd *pWnd;
-
pWnd = GetDlgItem( IDC_BUTTON1 ); //获取控件指针,IDC_BUTTON1为控件ID号
-
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE ); //把按钮移到窗口的(50,80)处
-
pWnd = GetDlgItem( IDC_EDIT1 );
-
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE ); //把编辑控件的大小设为(100,80),位置不变
-
pWnd = GetDlgItem( IDC_EDIT1 );
-
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER ); //编辑控件的大小和位置都改变
-
CWnd * pWnd;
-
pWnd = GetDlgItem(IDC_LIST); // 获取控件句柄
-
if (pWnd) // 判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
-
{
-
CRect rect; // 获取控件变化前大小
-
pWnd -> GetWindowRect( & rect);
-
ScreenToClient( & rect); // 将控件大小转换为在对话框中的区域坐标
-
// cx/m_rect.Width()为对话框在横向的变化比例
-
rect.left = rect.left * cx / m_rect.Width(); /**/ /// //调整控件大小
-
rect.right = rect.right * cx / m_rect.Width();
-
rect.top = rect.top * cy / m_rect.Height();
-
rect.bottom = rect.bottom * cy / m_rect.Height();
-
pWnd -> MoveWindow(rect); // 设置控件大小
-
}
-
GetClientRect( & m_rect); // 将变化后的对话框大小设为旧大小
贴一下对我自己实际问题的代码:
首先在头文件中定义几个变量:
CRect rectPointList,rectCmdResponse; CWnd *pWnd;
系统首先获取的屏幕坐标,获取后要将屏幕坐标转换成用户坐标系:
pWnd = (CWnd *)GetDlgItem(IDC_STATIC_GROUPBOX_POINT_LIST); pWnd->GetWindowRect(rectPointList); ScreenToClient(rectPointList); pWnd = (CWnd *)GetDlgItem(IDC_EDIT_RESPONSE); pWnd->GetWindowRect(rectCmdResponse); ScreenToClient(rectCmdResponse);
-
pWnd = GetDlgItem(IDC_EDIT_RESPONSE);
-
pWnd->MoveWindow(rectCmdResponse.left,rectCmdResponse.top,rectCmdResponse.right-rectCmdResponse.left,rectCmdResponse.bottom-rectCmdResponse.top);
-
//pWnd->SetWindowPos(NULL,rectCmdResponse.left,rectCmdResponse.top,rectCmdResponse.right-rectCmdResponse.left,rectCmdResponse.bottom-rectCmdResponse.top,SWP_NOZORDER);
MoveWindow和SetWindowPos的功能是一样,参数不一样。然后四个点的坐标,前两个一个是控件左边位置,一个是控件上边位置,第三个是控件的宽度,要用右边减去左边,第四个高度,要用下边减去上边。
这样就可以完美实现功能!
注意!!MFC中的Edit Control控件,如果往控件中写入时换行使用的是\n,那么在改变大小后,框里面的文字在新的位置不是换行的!而是全部排成一行。
所以在向Edit Control中输入文字时,最好!最好的换行使用 \r\n !!!!
联系人:徐经理
手机:13907330718
电话:0731-22222718
邮箱:hniatcom@163.com
地址: 湖南省株洲市石峰区联诚路79号轨道智谷2号倒班房6楼603室