路大爷 2016-06-03 08:33 采纳率: 37.5%
浏览 3737
已采纳

MFC中对话框中控件随对话框大小改变而等比例变化

本人刚开始学习MFC,C++也不是很好,在做MFC界面适配时遇到一些问题,求帮助!!!

对话框内的控件随着对话框的大小改变而等比例改变的问题,本人也在网上搜索到一些资料,试了一下成功了!

但是却出现了一个BUG!首先把代码给大家看一下吧!

1.在CMyDlg.h中添加一个声明:

CRect m_rect;

2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize();
if (nType == 1) return; //如果最小化则什么都不做
CWnd *pWnd;
pWnd = GetDlgItem(IDC_BUTTONA); //获取背景图片控件句柄
ChnageSize(pWnd, cx, cy);

pWnd = GetDlgItem(IDC_BUTTONB);   //获取控件句柄
ChnageSize(pWnd, cx, cy);

pWnd = GetDlgItem(IDC_PICTURE);   //获取控件句柄
ChnageSize(pWnd, cx, cy);

pWnd = GetDlgItem(IDD_DIALOG1_1);   //获取控件句柄
ChnageSize(pWnd, cx, cy);

pWnd = GetDlgItem(IDD_DIALOG2_2);   //获取控件句柄
ChnageSize(pWnd, cx, cy);

GetClientRect(&m_rect);     //将变化后的对话框大小恢复
InvalidateRect(&m_rect);

其中函数ChangeSize是手动添加的用户函数,步骤如下 

3.添加一个改变控件大小的用户函数,void ChangeSize(CWnd *pWnd, int cx, int cy),并编写代码
if (pWnd)
{
CRect rect; //获取控件变化前的大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect); //将控件大小转换为对话框中的区域坐标
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); //设置控件大小

}
在运行成功后控件可以实现放大缩小功能,但是随着对话框不断的放大缩小,控件会逐渐的向左上方移动,到达顶部的时候会压缩变小????哪位大神能指点一下,谢谢了!!!真心求教导!!!
  • 写回答

4条回答 默认 最新

  • nothingbutpassion 2016-06-04 07:38
    关注

    每次调用ChangeSize计算控件rect时,可能会产生误差(因为整数除以整数可能会导致商比真实值小)。随着调用次数的增加,误差逐渐累计,可能就会出现你描述那种现象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧