随笔 - 34, 文章 - 3, 评论 - 10, 引用 - 0
数据加载中……

mfc 控件大小随窗体改变而改变

  如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽.

  控件是从CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()来改变其大小,应在父窗口的WM_SIZE消息中使用MoveWindow()来进行调整。

  VC++之根据对话框大小调整控件大小

  1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;

  2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:

  GetClientRect(&m_rect);

  3、在WM_SIZE的响应函数OnSize()中加入以下代码:

  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);//将变化后的对话框大小设为旧大小

posted on 2009-11-04 10:54 wsy6634 阅读(6113) 评论(7)  编辑 收藏 引用

评论

# re: mfc 控件大小随窗体改变而改变  回复  更多评论   

很好的方法,试过很好用,谢谢了
顺便提一下,我是根据this->IsWindowVisible()判断的
谢谢!!!
2010-08-09 01:07 | 有收获就要感谢

# re: mfc 控件大小随窗体改变而改变  回复  更多评论   

最小化恢复后崩溃
2010-12-16 14:28 | lianaie

# re: mfc 控件大小随窗体改变而改变  回复  更多评论   

加一个判断就可以解决最小化之后崩溃的问题了

if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
{
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);

if(!cx||!cy)
return; //如果是最小化后再恢复就不要进行调整
else{

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);
}
}
2011-04-28 21:06 | guchu

# re: mfc 控件大小随窗体改变而改变  回复  更多评论   

mark一下~正好要做界面~还不会调整这个
2011-06-24 11:05 | 莫小烦sky

# re: mfc 控件大小随窗体改变而改变  回复  更多评论   

其实你这个方法是不行的。
原因就在于 rect.left*cx/m_rect.Width();

多次改变窗体大小后,由于运算精度问题,控件的大小根本不会跟随窗体的实际大小做出调整。而且控件尺寸会越来越小。

不信你可以试下。
2012-06-24 13:36 | 23helium

# re: mfc 控件大小随窗体改变而改变[未登录]  回复  更多评论   

老哥,你的窗体 最小化 就 除 0 错误 崩溃了
2012-10-31 22:41 | xxxx

# re: mfc 控件大小随窗体改变而改变  回复  更多评论   

确实是这样,只有窗体最大化和恢复原状没有问题,如你拖动窗体边缘,控件并不是完全按照你的意图而改变。
2016-06-07 10:54 | lmc

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理