




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一个基于对话框的 MFC界面,怎么样才能让对话框里的控件能和对话框同比例变小变大?今天我一直想解决这个问题,这是师姐留给我的任务。 经过在网上的大量搜素, 终于找到了解决方法,其实比较简单。一般情况下,我们新建的对话框,里面的确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。最简单的情况:当我们点击最大化按钮的时候, 对话框会最大化,但是控件 确定”和取消”不会跟着变大。 如果我们在对话框上面有多少控件, 那么会很丑,而且很不实用,最大化本来就是想看的更 清楚嘛。我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在win dowsMoveWind
2、ow()函数来重新设置message handle中有个 WM_SIZE的消息,该消息在窗口大小发生变化的时候会产生。那么 我们可以根据这个消息,在窗口大小发生变化的时候,利用 各个控件的大小。还是以上面最简单的情况为例子:1 首先要知道对话框大小是否改变,改变了多少,我们应该记录当前对话框的大小。在对话框类中添加成员变量 CRect m_rect 他是用来记录当前对话框的大小。我们在OnInitDialog() 函数中获取对话框创建时的大小: GetClientRect(&m_rect);2 增加消息 WM_SIZE 的消息响应函数 OnSize(): 只要对话框大小发生变化,就会调
3、用该函数。3在OnSize()函数中增加如下代码:(最简单的为例子,就一个确定按钮和取消按钮)void CTestDlg:OnSize(UINT nType, int cx, int cy)CDialog:OnSize(nType, cx, cy);/ TODO: Add your message handler code herefor (int i=1;i<=2;i+)/因为是两个控件,所以这里用了循环CWnd *pWnd;pWnd = GetDlgltem(i);获取ID为i的空间的句柄,因为 确认” ID为1,取消” ID为2if(pWnd) /判断是否为空,因为对话框创建时会调
4、用此函数,而当时控件还未创建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_rec
5、t.Height();pWnd->MoveWindow(rect);/ 设置控件大小GetClie ntRect(&m _rect); 将变化后的对话框大小设为旧大小然后运行,当对话框最大化的时候,两个按钮也变大了。個为全屏图太大,我只截取了右上角的部分)PS:其实这种方法实现起来简单,但是是存在问题的,如果界面有很多控件,那个当你拖拽窗口的角的时候, 经过几次变大变小, 你会发现其实里面的控件已经失真了, 就不是原来 的长宽比例了。 那么要实现不管窗口怎么变, 里面的控件不但大小跟着变, 而且大小比例也 跟着变,那就不是这个 OnSize 函数那么简单了,实现起来有点复杂。等我
6、掌握了这个复杂 的方法,一定会拿来分享的。mfc 控件大小随窗体改变而改变 如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽.控件是从 CWnd 派生的,但不能使用 SetWindowPos() 或 OnSize() 或 OnSizing() 来改 变其大小,应在父窗口的 WM_SIZE 消息中使用 MoveWindow() 来进行调整。VC+ 之根据对话框大小调整控件大小1、 在对话框类中加入成员变量CRect m_rect; 用于保存对话框大小变化前的大小;2、在对话框的 OnInitDialog() 函数中获取对话框创建时的大小:GetClientRect(&am
7、p;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.
8、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);/ 将变化后的对话框大小设为旧大小如果是里面只有一两个控件倒好办,但控件太多的话这样做是不是重复劳动太多了?有没有更好的办法啊?视类中加成员函数和成员变量:void SetControlInfo(W
9、ORD CtrlId);protected:int m_old_cx,m_old_cy;CDWordArray m_control_info;构造函数中初始化:m_old_cx = m_old_cy = 0;加控件信息的函数定义:void CTestFormView:SetControlInfo(WORD CtrlId)m_control_info.Add(CtrlId);修改 OnSize 函数:void CTestFormView:OnSize(UINT nType, int cx, int cy) if(cx=0 | cy=0)cx=800;cy=600;CFormV iew:OnSiz
10、e(nType, cx, cy);(float)(float)cx/(float)m_old_cx);(float)(float)cy/(float)m_old_cfloatdx_percent=(m_old_cx=0)?1floatdy_percent=(m_old_cy=0)?1y);if(m_old_cx)CRect WndRect;CWnd *pWnd;for(int i = 0; i < m_control_info.GetSize(); i+)pWnd = GetDlgItem(m_control_infoi); if(!pWnd)TRACE( "Control ID - %d NOT FOUND!n ",m_control_infoi);continue;pWnd-> GetWindowRect(&WndRect);ScreenToClient(&WndRect);WndRect.left = (int)(WndRect.left*dx_percent); WndRect.right = (int)(WndRect.right* dx_percent); WndRect.bottom = (int)(WndRect.bottom*dy_percent); WndRect.t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 法律行业合同法与知识产权试题集
- 大规模数据分析与应用实战指南
- 孵化器房屋租赁合同
- 管道衬胶施工方案
- 南通环保槽钢施工方案
- 包柱广告施工方案
- 平面夯实施工方案
- 带电开挖电缆施工方案
- 旋挖咬合桩施工方案
- 部分区县一模数学试卷
- 医疗器械经营质量管理规范培训试题及答案
- 监理工作业务指导手册(页含图表)
- 新大象版科学四年级下册珍贵的淡水资源课件公开课一等奖课件省赛课获奖课件
- 2023年陕西延长石油(集团)有限责任公司招聘笔试题库含答案解析
- 水稻种子生产技术
- 财经纪律规范财务管理办法
- 第四章 学习心理导论
- 旅游政策与法规教案
- 科创板开户试题附答案
- 长输管道工序监理作业指导书
- 主主题三:医院感染控制标准执行案例
评论
0/150
提交评论