从来都是做对话框程序,这次想做个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值进行更改。

先上代码吧,无码无真相。

void CRealTimeFV::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码 http://blog.csdn.net/wlsgzl/article/details/34099313
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页,对其他控件未作尝试。)

转载请注明出处http://blog.csdn.net/wlsgzl/article/details/34099313。

要注意的是:

1.最好先限制下SDI程序界面的最小大小。

2.在调用此函数之前,先获得一次m_lastRect。至于怎么获得,如何获得,便是仁者见仁智者见智的事情了。

3.我添加了if,必然是有原因的,不相信可以自己跟消息跟便变量。至于原因,这属于怎样学好MFC的问题,讲不了,我也不敢说自己学好了。

4.定义了rc和lpClientRect,是因为我之前写错了位置,又不想改,就做了下小调整。

问题解决——MFC SDI程序 CFormView中控件随窗口缩放的更多相关文章

  1. 问题解决——MFC SDI程序 CFormView中控件随窗体缩放

    从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格.就不用使用那些花钱的商业控件/UI库了. 假设你不想看我打的文字.能够直接拷走代码,自己声明上定义 ...

  2. Qt 控件随窗口缩放

    在Qt的界面设计中,我们有时候希望窗口在最大化的时候,上面的控件也跟着缩放,那么我们就需要调整控件的SizePolicy属性,关于这个属性的讲解请参见我之前的博客Qt SizePolicy 属性,由于 ...

  3. 魔改——MFC SDI程序 转换为 MDI程序

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  4. 对AutoIt中控件和窗口的理解

    经过尝试,对AutoIt中Control和Window有了新的认识,分享一下 1.Control 现在我想对一个WinForm架构的应用程序进行自动化操作,得到控件Advanced Mode属性为[N ...

  5. MFC的程序,不想显示窗口,任务栏里也不显示

    在dialog的oninitdialog里设置如下属性,很简单,网上一些乱七八糟的做法,一行代码就能搞定啊 SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,S ...

  6. C#中控件数组的讨论

    VB用得习惯后,到C#中来觉得很奇怪,如此好的控件数组怎么不见了.“众所周知,控件数组最主要的两个优点:可以循环附值:可以响应同一个事件.从而大大简化了代码.引自http://wenku.baidu. ...

  7. MFC应用程序框架入门(转)

    1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...

  8. 如何优雅的写UI——(2)MFC下基于CFormView的文档视图程序

    在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...

  9. 【VS开发】VS2010 MFC中控件、对话框等背景颜色动态修改的方法

    [VS开发]VS2010 MFC中控件.对话框等背景颜色动态修改的方法 标签(空格分隔):[VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明: ...

随机推荐

  1. 转载:全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新!

    微信应用号(小程序,「应用号」的新称呼)终于来了! 目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子?怎样将一个「服务号」改造成为「小程序」? 我们暂时以 ...

  2. [操作系统实验lab3]实验报告

    [感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...

  3. myeclipse怎么github

    myeclipse怎么github 第一步.打开myeclipse->选择项目->鼠标右键->Team->Share project,将出现如下图所示: 第二步.选择git,在 ...

  4. WampServer 给电脑搭建apache服务器和php环境

    WampServer 给电脑搭建apache服务器和php环境 前端不仅要做页面展示层,还负责着数据交互的部分,不要等到后端人员做好工作了前端才开始对接,那样太被动了. 前端在完成静态页面的编码后,就 ...

  5. 解决打印机报错:操作无法完成(错误0x00000709)。

    解决:操作无法完成(错误0x00000709).再次检查打印机名称,并确保打印机已连接到... 上午同时说,网络打印机打印不了,于是首先看一下打印服务器IP是不是给换了,结果没换. 接着尝试重新添加一 ...

  6. 启动Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误

    启动Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误,如下 原因:eclipse的版本与jre或者jdk版本不 ...

  7. Delphi又要换东家了

    前几天听到这个消息,搞个FMX出来,64位还没搞清楚,又开始折腾了!http://www.deltics.co.nz/blog/posts/2371 No Seriously – Let’s Buy ...

  8. log4j.xml 配置参数属性level使用心得

    jdbc.sqlonly        只显示执行的sql语句.info级才可以显示,debug增加显示java源代码位置. jdbc.sqltiming    显示执行的sql语句以及语句执行时间, ...

  9. 跟踪js文件作为iframe页面不起作用时(淘宝天猫)

    跟踪文件 (function(win, doc) { var s = doc.createElement("script"), h = doc.getElementsByTagNa ...

  10. ArcGIS10.2下调试10.1的程序

    听说:10.2比10.1好,诚然,安装了10.2打开一看是这样的,以为是下载的版本问题,后来才以现是显示设置的问题. 因为,我使用的两个显示器,屏幕有点大,所以,就改成中等了,不然怎么可截取下面的截图 ...