问题解决——MFC SDI程序 CFormView中控件随窗口缩放
2014-06-24 14:38
288 查看
从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格,就不用使用那些花钱的商业控件/UI库了。
如果你不想看我打的文字,可以直接拷走代码,自己声明上定义再略作修改就可以用了,不需大的修改。
-------------------------------小尾巴首次登场-----------------------------------
SDI程序,是要缩放的,如果是往里输入文字的话,这倒没什么,但是这次我使用的是CFormView类,里面加了控件。
———————————我才是分割线————————————
大致上有3种方法
方法1:
1.记录原始的CFormView的RECT,在OnSize中获得当前Rect,求出放大比例。
2.对每个控件,在OnSize中获取当前RECT,然后乘以放大比例,作为新的RECT大小。
3.对每个控件,调用MoveWindow函数,完成缩放。
这种方法对每一个控件,都编写代码进行操作,必然是缩放效果最好的。但是,当控件太多时,真的需要一个好脾气,而且要细心,善于调试。(复制粘贴,这么做有时候会让你编译链接过,但是就是一直错。)
方法2:
这是对方法1的改进。需要一定的知识和技巧。
所有控件的定义都是在*.rc文件中,但是这些控件的ID声明却都在resource.h中。如果你有足够的耐心和另外一块显示屏,那么你可以:
1.更改这些控件的ID值,使它们顺序增长(减小),这样我们就可以在一个循环里完成方法1中对控件的操作,只需1套代码。(不要害怕改坏了,对于不同的控件,只要在resource.h中ID值不重复就行了。)
这种方法看起来是对方法1的优化,但是实际上,对于代码的维护以及任务的交接都是不太好的。当控件较多时,手工的对ID进行记录更改排序,你需要比方法1还好的脾气。
-------------------你不觉得上面的分割线的风格怪怪的吗-------------------------
方法3:
我采用了这种,主要是不想维护太多的代码,也不想在如此众多的宏中对ID值进行更改。
先上代码吧,无码无真相。
(可用于按钮、编辑框、GroupBox、ComboBox、静态文本框、Tab页,对其他控件未作尝试。)
转载请注明出处/article/2122659.html。
要注意的是:
1.最好先限制下SDI程序界面的最小大小。
2.在调用此函数之前,先获得一次m_lastRect。至于怎么获得,如何获得,便是仁者见仁智者见智的事情了。
3.我添加了if,必然是有原因的,不相信可以自己跟消息跟便变量。至于原因,这属于怎样学好MFC的问题,讲不了,我也不敢说自己学好了。
4.定义了rc和lpClientRect,是因为我之前写错了位置,又不想改,就做了下小调整。
如果你不想看我打的文字,可以直接拷走代码,自己声明上定义再略作修改就可以用了,不需大的修改。
-------------------------------小尾巴首次登场-----------------------------------
SDI程序,是要缩放的,如果是往里输入文字的话,这倒没什么,但是这次我使用的是CFormView类,里面加了控件。
———————————我才是分割线————————————
大致上有3种方法
方法1:
1.记录原始的CFormView的RECT,在OnSize中获得当前Rect,求出放大比例。
2.对每个控件,在OnSize中获取当前RECT,然后乘以放大比例,作为新的RECT大小。
3.对每个控件,调用MoveWindow函数,完成缩放。
这种方法对每一个控件,都编写代码进行操作,必然是缩放效果最好的。但是,当控件太多时,真的需要一个好脾气,而且要细心,善于调试。(复制粘贴,这么做有时候会让你编译链接过,但是就是一直错。)
方法2:
这是对方法1的改进。需要一定的知识和技巧。
所有控件的定义都是在*.rc文件中,但是这些控件的ID声明却都在resource.h中。如果你有足够的耐心和另外一块显示屏,那么你可以:
1.更改这些控件的ID值,使它们顺序增长(减小),这样我们就可以在一个循环里完成方法1中对控件的操作,只需1套代码。(不要害怕改坏了,对于不同的控件,只要在resource.h中ID值不重复就行了。)
这种方法看起来是对方法1的优化,但是实际上,对于代码的维护以及任务的交接都是不太好的。当控件较多时,手工的对ID进行记录更改排序,你需要比方法1还好的脾气。
-------------------你不觉得上面的分割线的风格怪怪的吗-------------------------
方法3:
我采用了这种,主要是不想维护太多的代码,也不想在如此众多的宏中对ID值进行更改。
先上代码吧,无码无真相。
void CRealTimeFV::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 /article/2122659.html RECT rc; GetClientRect(&rc); LPRECT lpClientRect=&rc; m_dXRate=lpClientRect->right/(double)m_lastRect.right; m_dYRate=lpClientRect->bottom/(double)m_lastRect.bottom; if (lpClientRect->right!=0 && lpClientRect->bottom!=0) { m_lastRect.bottom=lpClientRect->bottom; m_lastRect.left=lpClientRect->left; m_lastRect.right=lpClientRect->right; m_lastRect.top=lpClientRect->top; CWnd *pWnd=NULL; pWnd=GetWindow(GW_CHILD); while (pWnd) { CString strCaption; pWnd->GetWindowTextW(strCaption); OutputDebugString(TEXT("Caption:")+strCaption+TEXT("\n")); CRect childRect; pWnd->GetWindowRect(&childRect); ScreenToClient(&childRect); childRect.left=(LONG)(childRect.left*m_dXRate); childRect.top=(LONG)(childRect.top*m_dYRate); childRect.right=(LONG)(childRect.right*m_dXRate); childRect.bottom=(LONG)(childRect.bottom*m_dYRate); pWnd->MoveWindow(&childRect,TRUE); pWnd=pWnd->GetWindow(GW_HWNDNEXT); } } }代码肯定有优化改进的余地,但这不是本文的主要意图。
(可用于按钮、编辑框、GroupBox、ComboBox、静态文本框、Tab页,对其他控件未作尝试。)
转载请注明出处/article/2122659.html。
要注意的是:
1.最好先限制下SDI程序界面的最小大小。
2.在调用此函数之前,先获得一次m_lastRect。至于怎么获得,如何获得,便是仁者见仁智者见智的事情了。
3.我添加了if,必然是有原因的,不相信可以自己跟消息跟便变量。至于原因,这属于怎样学好MFC的问题,讲不了,我也不敢说自己学好了。
4.定义了rc和lpClientRect,是因为我之前写错了位置,又不想改,就做了下小调整。
相关文章推荐
- 问题解决——MFC SDI程序 CFormView中控件随窗口缩放
- 问题解决——MFC SDI程序 CFormView中控件随窗体缩放
- mfc 基于formview的sdi 打开文档后 窗口变小的问题
- 一个SDI程序基于CFormView视。上面放一个CStatic控件,给视图添加双击消息,运行程序后,双击视图,会有弹出消息响应。 但是双击CStatic类控件,却没有响应
- Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题)
- 主窗口大小发生变化(最大化、向下还原、手工手动)时,FormView中的控件等比例缩放
- MFC 程序解决CListCtrl控件点击项重复执行的问题
- MFC中使用串口控件后程序无法打开的问题解决
- 解决formview遍历控件的问题
- MFC中SDI,视类继承于CFormView引发的相关问题
- MFC中SDI,视类继承于CFormView引发的相关问题
- 解决控件遮挡问题:关于有窗口元素和无窗口元素
- 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误
- 如何解决窗口和程序最小化后在任务栏消失的问题
- 解决ASP.NET1.1, ASP.NET2.0,ASP.NET3.5中验证控件和自定义弹出确认窗口的冲突问题
- V单视图拆分含有FormView的视类中出现的问题及解决办法
- 程序编码问题..如何设置引用控件支持字符编码.解决传参中编码问题
- VS2005下的WAP程序开发(OnViewStateExpire问题解决)
- vs2005编译的release MFC程序无法在未安装2005的机器上使用的问题解决
- smarty作为view时使用Zend_Form出现方法未定义的问题原因及解决