一个关于MFC单文档程序窗口变化调整控件大小的问题???

我现在有一个单文档程序,然后我在视图分割了两个,左边一个,右边一个是显示一个list列表框,然后还有十几个按钮。我现在运行程序后,发现按钮没随着视图改变而改变。我在网上搜... 我现在有一个单文档程序,然后我在视图分割了两个,左边一个,右边一个是显示一个list列表框,然后还有十几个按钮。我现在运行程序后,发现按钮没随着视图改变而改变。我在网上搜了资料有一个类可以安排所有自定义的按钮按照比例排版。我见例子里面说是获得Getwindowrect,然后又Screentoclient客户区。画出来以后发现超出了客户区。视图类是CFormView类。
请大家帮忙我应该怎样排版我这些按钮呢。
展开
 我来答
龚炜林
2012-12-17 · TA获得超过1560个赞
知道大有可为答主
回答量:1102
采纳率:66%
帮助的人:584万
展开全部
在CFormView里面添加Onsize消息响应,在里面按比例放大缩小控件大小,当视图大小变化了,控件大小及其相对位置也要变化,使用MoveWindow
举个例子,你先保存原来视图大小宽widOld,高heiOld
然后某一次视图大小宽变为widNew,你算出这个增加的比例,控件的比例也按这个放大或者缩小就是了。
追问
在Onsize函数里面保存原有视图大小码?可是我 在网上搜到一些关于按照比例算的。然后代码里用到了Getwindowrect()函数,然后又转换Screentoclient客户区,当程序最大化后是可以放到的。但是边界看不到。是不是我直接取客户区的大小然后再算啊。那样的话,我的那些控件就都扎堆到一起了。请高手给个指示!!!
追答
我一直这样做,完全行的。
你的做法可能不妥当:对于CFormView,Onsize的参数里面有其大小,而在Onsize里面要修改控件的位置
CDialog::OnSize(nType, cx, cy);
if(nType==1)//最小化
return;
GetClientRect(&m_DlgRect);
if(IsWindowVisible())
{
float x = (float)cx / (float)m_DlgRect.Width();
float y = (float)cy / (float)m_DlgRect.Height();
CRect rect;
GetDlgItem(IDC_T1)->GetWindowRect(rect);
ScreenToClient(rect);
rect.left = (int)(rect.left*x);
rect.right = (int)(rect.right*x);
rect.top = (int)(rect.top*y);
rect.bottom = (int)(rect.bottom*y);
GetDlgItem(IDC_T1)->MoveWindow(rect);
}
其中m_DlgRect是自定义CRect对象,为对话框类的成员对象。

这样做有个不妥的就是:经过多次尺寸变化后,控件位置会相对有些偏移。
要完全消除这种偏移,可以分别为每个控件定义一个CRect对象或者自定义能记录矩形的结构体,记录控件的在程序启动时的坐标,相应的CFormView启动的坐标也得记录,然后每次改变尺寸不是GetWindowRect来重新获取控件坐标再进行比例运算,而是先通过cx和cy与CFormView启动时的坐标的比例来对应的放大与缩小就行。
如果要这样做,个人建议自定义结构体记录坐标,因为你的显示器坐标最大不会超过65535,所以相对于CRect可以缩减内存消耗,如果使用位域,那就更好了。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式