问题解决——MFC SDI程序 CFormView中控件随窗口缩放
从来都是做对话框程序,这次想做个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中控件随窗口缩放的更多相关文章
- 问题解决——MFC SDI程序 CFormView中控件随窗体缩放
从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格.就不用使用那些花钱的商业控件/UI库了. 假设你不想看我打的文字.能够直接拷走代码,自己声明上定义 ...
- Qt 控件随窗口缩放
在Qt的界面设计中,我们有时候希望窗口在最大化的时候,上面的控件也跟着缩放,那么我们就需要调整控件的SizePolicy属性,关于这个属性的讲解请参见我之前的博客Qt SizePolicy 属性,由于 ...
- 魔改——MFC SDI程序 转换为 MDI程序
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 对AutoIt中控件和窗口的理解
经过尝试,对AutoIt中Control和Window有了新的认识,分享一下 1.Control 现在我想对一个WinForm架构的应用程序进行自动化操作,得到控件Advanced Mode属性为[N ...
- MFC的程序,不想显示窗口,任务栏里也不显示
在dialog的oninitdialog里设置如下属性,很简单,网上一些乱七八糟的做法,一行代码就能搞定啊 SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,S ...
- C#中控件数组的讨论
VB用得习惯后,到C#中来觉得很奇怪,如此好的控件数组怎么不见了.“众所周知,控件数组最主要的两个优点:可以循环附值:可以响应同一个事件.从而大大简化了代码.引自http://wenku.baidu. ...
- MFC应用程序框架入门(转)
1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...
- 如何优雅的写UI——(2)MFC下基于CFormView的文档视图程序
在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...
- 【VS开发】VS2010 MFC中控件、对话框等背景颜色动态修改的方法
[VS开发]VS2010 MFC中控件.对话框等背景颜色动态修改的方法 标签(空格分隔):[VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明: ...
随机推荐
- EF错误记录
纯属个人记录错误使用: 1.EntityType“area”未定义键.请为该 EntityType 定义键. 产生原因: 1.命名空间引用错误,可能命名重复导致引用错误 2.实体类无法识别主键或者未设 ...
- [ASP.NET] 下一代ASP.NET开发规范:OWIN
今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 OWIN(Open Web Int ...
- Mybatis 中在传参时,${} 和#{} 的区别
介绍 MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型. 在SQL中引用这些参数 ...
- AEAI ESB V3.5.4开源发布,应用集成平台
AEAI ESB 应用集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将ESB管理控制台项目开源,目的在于满足客户与伙伴的OEM需求,以及为广大IT爱好者的集成工具提供多一种选择,多一种便利 ...
- 【iOS】利用Runtime特性做监控
最近在看Object-C运行时特性,其中有一个特别好用的特性叫 Method Swizzling ,可以动态交换函数地址,在应用程序加载的时候,通过运行时特性互换两个函数的地址,不改变原有代码而改变原 ...
- 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
[源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...
- MyBatis中的特殊符号[20160713]
今天中午回到工位已经是12:20多了,没有时间睡觉了,本想着还能提前开始,结果看了点新闻之后,又是12:40了,所以新闻坚决不能看,执行力. 今天主要记录一下MyBatis中的特殊符号的问题,这个问题 ...
- 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...
- Javascript中void操作符
Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. void操作符用法格式如下:1.javascript:void (expression)2.javascript ...
- Android Studio使用教程(二)
以下是本次Google I/O大会发布的IDE Android Studio使用教程第二篇: 在Android Studio使用教程(一)中简要介绍了Android Studio的基本使用,包括安装. ...