从来都是做对话框程序,这次想做个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);
}
}
}

代码肯定有优化改进的余地。但这不是本文的主要意图。

(可用于button、编辑框、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. 魔改——MFC SDI程序 转换为 MDI程序

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

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

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

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

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

  5. MFC中控件的TAB顺序 ----转载

    在MFC中添加控件后,按Ctrl+d可以改变控件TAB顺序,怕自己忘了,一个神奇的东西,记下. 关于改变Tab顺序的方法有以下几种: 方法一:在动态创建控件的时候STYLE设置成为WS_CHILD|W ...

  6. MFC中SDI程序创建流程的回顾

    SDI程序创建流程的回顾 从CWinApp.InitialInstance()开始, 1.首先应用程序对象创建文档模板; CSingleDocTemplate* pDocTemplate; pDocT ...

  7. MFC中控件的TAB顺序

    本文来自: http://hi.baidu.com/qingcaichongch/item/47f7ae14de8cbef6ddeeca42 在MFC中添加控件后,按Ctrl+d可以改变控件TAB顺序 ...

  8. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  9. MFC应用程序框架(转)

    对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便.其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用 ...

随机推荐

  1. [CodeForces-178F]Representative Sampling

    题目大意: 给你n个字符串,要求从中选出k个字符串,使得字符串两两lcp之和最大. 思路: 动态规划. 首先将所有的字符串排序,求出相邻两个字符串的lcp长度(很显然,对于某一个字符串,和它lcp最长 ...

  2. DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

    BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 419  Solve ...

  3. Codeforces Beta Round #5 A. Chat Server's Outgoing Traffic 水题

    A. Chat Server's Outgoing Traffic 题目连接: http://www.codeforces.com/contest/5/problem/A Description Po ...

  4. Ubuntu 16.04开启SFTP服务

    说明:其实只要安装了SSH服务就已经具备了SFTP功能,这个用普通客户端无法连接,只能用支持SFTP协议的客户端才能连接. FileZilla作为FTP客户端,它也可以连接SFTP,SFTP的监听端口 ...

  5. KVM虚拟机安装使用教程(Ubantu)

    背景: 公司在某电信机房有50台ubantu的实体机,机器配置的ip是192.168.100.x的ip,内存和cpu都是高端配置.假如哪些端口需要对外映射,就通过机房的防火墙完成端口映射. 100.1 ...

  6. HDU 4681 String(2013多校8 1006题 DP)

    String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

  7. VS2010 + IDA SDK 搭建IDA Plugin开发环境

    http://www.h4ck.org.cn/2011/11/vs2010-idasdk6-2-ida-plugin-development/ 1. 执行菜单的File->New->Pro ...

  8. 关于心理的二十五种倾向(查理·芒格)-5

    17)压力影响倾向人在遇到突然的压力.比方遭遇危急时.会导致人体内部的肾上腺素激增,推动更快,更极端的反应. A)人在压力的情况下会使得社会认同倾向更加强大.B)人在压力的情况下会使得避免怀疑倾向更加 ...

  9. .Net4.0并行库介绍——Task

    Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务.对于将一个任务放进线程池     ThreadPool.QueueUserWorkItem(A); 这段代码用Task来实现 ...

  10. 采集音频和摄像头视频并实时H264编码及AAC编码[转]

    0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...