从来都是做对话框程序,这次想做个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. 一起Polyfill系列:让Date识别ISO 8601日期时间格式

    一.什么是ISO 8601日期时间格式 ISO 8601是国际标准化组织制定的日期时间表示规范,全称是<数据存储和交换形式·信息交换·日期和时间的表示方法>. 示例: 1. 2014-12 ...

  2. <!DOCTYPE> 的理解

    [[ from <!DOCTYPE> 标签的深入理解 ]] 前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建 ...

  3. Entity FrameWork 增删查改

    Add #region 1.0 新增+void Add() /// <summary> /// 新增 /// </summary> static void Add() { // ...

  4. Dancing Link 详解(转载)

    Dancing Link详解: http://www.cnblogs.com/grenet/p/3145800.html Dancing Link求解数独: http://www.cnblogs.co ...

  5. Android读写SD卡

    SD卡的读写是我们在开发Android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String sdCardRoot = Environment.getEx ...

  6. SQL索引学习-索引结构

    前一阵无意中和同事讨论过一个SQL相关的题(通过一个小问题来学习SQL关联查询),很惭愧一个非常简单的问题由于种种原因居然没有回答正确,数据库知识方面我算不上技术好,谈起SQL知识的学习我得益于200 ...

  7. 在uwp仿制WPF的Window

    移植WPF软件到uwp时碰到用作对话框的Window有多种处理选择.我个人认为最省事的是用ContentDialog模拟Window. 比如你想把上面这个WPF窗体弄到uwp里面去 1.修改Conte ...

  8. sql server2008安装错误(无法处理异常)

    我在安装sql server2008时出现安装错误,无法处理的异常,问题如下: 解决方法:在地址栏输入C:\Users\Administrator\AppData\Local ,找到Microsoft ...

  9. USE “schema_name” in PostgreSQL

    http://timmurphy.org/tag/mysql/ http://timmurphy.org/2009/11/17/use-schema_name-in-postgresql/ ===== ...

  10. 选择使用c语言编写的phalcon框架

    使用这个框架,我总结了如下几点考虑 1.这个框架速度快.纯c语言编写的框架,速度都比php框架快,省去了中间环节.当然,使用它不仅仅是性能考虑.因为如果为了解决php性能问题,完全可以有很多种方式,不 ...