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()函数添加这些代码后,父窗口的变化后子控件虽然变化,但是变着变着就走形了。
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()函数添加这些代码后,父窗口的变化后子控件虽然变化,但是变着变着就走形了。
解决方案 »
- <分享>如何编写自己想要的控件(start from CWnd)
- 关于截获ActiveX控件消息的问题
- 一个新手的2个问题
- 初学者:请问如果我想应用程序里调用windows的计算器,并返回计算结果到应用程序中,该怎么实现,要知道那些技术?
- CDialogBar的问题
- 请问怎么给一个EDIT框自动缩行,比如我按回车后它的下一行自动缩进4个字符,就象VC的编辑环境一样?
- 把窗口最小化后,有某一事件发生,需要让该窗口标题栏不断闪烁,怎么做?
- 关于MSDN的问题
- 一个很奇怪的问题,哪位大侠有兴趣进来看看吧,是关于多线程和SOCKET的
- 创建线程时出错! 求救!求救!求救!
- N次执行N条SQL语句和一次执行N条SQL语句,有什么性能区别吗?
- 请教各位大神MFC问题,关于CEdit的显示问题
就可以!
或者这样试试
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都是采用第一次时的值
就在OnInitDialog里面取一次,OnSize里面用初始值来计算,不要让误差累积.
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); //设置控件大小
}
}
里面的IDC_STATIC_TYPE是啥?
相当于你程序里的IDC_LIST1,好像是差不多,只是我的没有乘以1.0,还有我的多了一句:CDialogEx::OnSize(nType, cx, cy);和 一个判断if(nType != SIZE_MINIMIZED );我也不是什么高手,不过我用这个没有问题,所以贴出来,希望可以帮到你点什么