VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 468|回复: 4

[技术文章] mfc控件随着窗口大小变化

[复制链接]
29_avatar_middle
online_vip CDocking 发表于 2018-2-24 12:21:32 | 显示全部楼层 |阅读模式
在创建tab标签页控件的时候发现,创建出来的子对话框大小和主对话框大小并不一致。在右侧和下侧会有很大的间隙,显得很不美观,需要动态调整控件的大小。

mfc控件随着窗口大小变化

找论坛客服帮忙看了下(不得不说论坛客服指导还是很给力的,有问必答),不过修改的list控件的大小变化,如果添加了其他的控件还是不行,于是自己又百度修改了下,分享下解决方法。

解决方法很简单

1、在子类的(注意不是主类,你添加的tab子窗口的类)头文件里面添加 POINT Old;

2、在OnInitDialog()中添加
  1. CRect rect;   
  2. GetClientRect(&rect); //取客户区大小   
  3. Old.x=rect.right-rect.left;
  4. Old.y=rect.bottom-rect.top;
复制代码


3、添加 WM_SIZE消息
  1. if(nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED)//窗体大小发生变动。处理函数resize
  2. {
  3.   resize();
  4. }
复制代码


4、添加reseze函数
  1. void CMyDialog::resize()
  2. {
  3. float fsp[2];
  4. POINT Newp; //获取现在对话框的大小
  5. CRect recta;   
  6. GetClientRect(&recta); //取客户区大小   
  7. Newp.x=recta.right-recta.left;
  8. Newp.y=recta.bottom-recta.top;
  9. fsp[0]=(float)Newp.x/Old.x;
  10. fsp[1]=(float)Newp.y/Old.y;
  11. CRect Rect;
  12. int woc;
  13. CPoint OldTLPoint,TLPoint; //左上角
  14. CPoint OldBRPoint,BRPoint; //右下角
  15. HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件   
  16. while(hwndChild)   
  17. {   
  18.   woc=::GetDlgCtrlID(hwndChild);//取得ID
  19.   GetDlgItem(woc)->GetWindowRect(Rect);   
  20.   ScreenToClient(Rect);   
  21.   OldTLPoint = Rect.TopLeft();   
  22.   TLPoint.x = long(OldTLPoint.x*fsp[0]);   
  23.   TLPoint.y = long(OldTLPoint.y*fsp[1]);   
  24.   OldBRPoint = Rect.BottomRight();   
  25.   BRPoint.x = long(OldBRPoint.x *fsp[0]);   
  26.   BRPoint.y = long(OldBRPoint.y *fsp[1]); //高度不可读的控件(如:combBox),不要改变此值.
  27.   Rect.SetRect(TLPoint,BRPoint);   
  28.   GetDlgItem(woc)->MoveWindow(Rect,TRUE);
  29.   hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);   
  30. }
  31. Old=Newp;
复制代码


注:BRPoint.y = long(OldBRPoint.y *fsp[1]); //高度不可读的控件(如:combBox),不要改变此值.
这点没太说清楚,遍历控件,如果遍历到combBox的时候,加判断,不要执行这句代码,也就是不要试图改变BRPoint.y的值,否则的话,combBox内就会没内容,困扰了好长时间才找到原因,是因为combBox的高度不可读。
另外,如果界面里添加了静态文本控件,修改将默认的静态文本控件的ID修改(随意修改,不是默认的即可),否则会出现界面控件位置错乱

修改以后的界面如下,比之前美观很多。

mfc控件随着窗口大小变化

工程源码下载地址,回复后可见:

游客,如果您要查看本帖隐藏内容请回复




上一篇:一个Hello World引发的故事
下一篇:mfc连接mysql数据库实例

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

76_avatar_middle
在线会员 点滴回忆 发表于 2018-3-5 20:08:12 | 显示全部楼层
虽然不懂mfc,但是也来学习下

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

08_avatar_middle
在线会员 woliveyou 发表于 2018-3-6 21:38:21 | 显示全部楼层
mfc控件随着窗口大小变化

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

34_avatar_middle
在线会员 zwf8311 发表于 2018-3-7 09:11:22 | 显示全部楼层
学习中....谢谢分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-17 05:49

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表