首页 VC控件大小随窗体改变

VC控件大小随窗体改变

举报
开通vip

VC控件大小随窗体改变般情况下,我们新建的对话框,里面的确定”和:取消”按钮,在对话框最大化得时候,般情况下,我们新建的对话框,里面的确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。最简单的情况:当我们点击最大化按钮的时候,对话框会最大化,但是控件确定”和取消”不会跟着变大。如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在windowsmessagehandle中有个WM_SIZE的消息,该消息在...

VC控件大小随窗体改变
般情况下,我们新建的对话框,里面的确定”和:取消”按钮,在对话框最大化得时候,般情况下,我们新建的对话框,里面的确定”和:取消”按钮,在对话框最大化得时候,不会一起变大的,而是保持原来的大小。最简单的情况:当我们点击最大化按钮的时候,对话框会最大化,但是控件确定”和取消”不会跟着变大。如果我们在对话框上面有多少控件,那么会很丑,而且很不实用,最大化本来就是想看的更清楚嘛。我们可以采取下面的措施:对话框也是窗口,最大化是对窗口大小的改变,而在windowsmessagehandle中有个WM_SIZE的消息,该消息在窗口大小发生变化的时候会产生。那么我们可以根据这个消息,在窗口大小发生变化的时候,利用MoveWindow()函数来重新设置各个控件的大小。还是以上面最简单的情况为例子:1首先要知道对话框大小是否改变,改变了多少,我们应该 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 当前对话框的大小。在对话框类中添加成员变量CRectm_rect他是用来记录当前对话框的大小。我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);2增加消息WM_SIZE的消息响应函数OnSize():只要对话框大小发生变化,就会调用该函数。3在OnSize()函数中增加如下代码:(最简单的为例子,就一个确定按钮和取消按钮)voidCTestDlg::OnSize(UINTnType,intcx,intcy){CDialog::OnSize(nType,cx,cy);//TODO:Addyourmessagehandlercodeherefor(inti=1;i<=2;i++)//因为是两个控件,所以这里用了循环{CWnd*pWnd;pWnd=GetDlgltem(i);//获取ID为i的空间的句柄,因为确认”ID为1,取消”D为2if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建{CRectrect;//获取控件变化前的大小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);〃将变化后的对话框大小设为旧大小}然后运行,当对话框最大化的时候,两个按钮也变大了。個为全屏图太大,我只截取了右上角的部分)PS:其实这种方法实现起来简单,但是是存在问题的,如果界面有很多控件,那个当你拖拽窗口的角的时候,经过几次变大变小,你会发现其实里面的控件已经失真了,就不是原来的长宽比例了。那么要实现不管窗口怎么变,里面的控件不但大小跟着变,而且大小比例也跟着变,那就不是这个OnSize函数那么简单了,实现起来有点复杂。等我掌握了这个复杂的方法,一定会拿来分享的。mfc控件大小随窗体改变而改变如果对话框或视类的大小调后,控件的大小和位置没有变化,界面看起来会很不爽.控件是从CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()来改变其大小,应在父窗口的WM_SIZE消息中使用MoveWindow()来进行调整。VC++之根据对话框大小调整控件大小1、在对话框类中加入成员变量CRectm_rect;用于保存对话框大小变化前的大小;2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);3、在WM_SIZE的响应函数OnSize()中加入以下代码:CWnd*pWnd;pWnd=GetDlgItem(IDC_LIST);//获取控件句柄if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建{CRectrect;//获取控件变化前大小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);//将变化后的对话框大小设为旧大小如果是里面只有一两个控件倒好办,但控件太多的话这样做是不是重复劳动太多了?有没有更好的办法啊?视类中加成员函数和成员变量:voidSetControlInfo(WORDCtrlId);protected:intm_old_cx,m_old_cy;CDWordArraym_control_info;构造函数中初始化:m_old_cx=m_old_cy=0;加控件信息的函数定义:voidCTestFormView::SetControlInfo(WORDCtrlId){m_control_info.Add(CtrlId);}修改OnSize函数:voidCTestFormView::OnSize(UINTnType,intcx,intcy){if(cx==0||cy==0){cx=800;cy=600;CFormView::OnSize(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){CRectWndRect;CWnd*pWnd;for(inti=0;iGetWindowRect(&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.top=(int)(WndRect.top*dy_percent);pWnd->MoveWindow(&WndRect);}cx;cy;}m_old_cxm_old_cy}在OnInitialUpdate函数中加入控件ID:SetControlInfo(IDC_BUTTON1);。。。。。。。。。。。。。。。。运行,搞定!Dialog也一样!
本文档为【VC控件大小随窗体改变】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_179289
暂无简介~
格式:doc
大小:40KB
软件:Word
页数:6
分类:
上传时间:2018-05-18
浏览量:0