使用一个CWnd空闲池创建一个动态用户界面

介绍

本文提出了一组可以用来动态创建UI的类。该代码是集中于一个空闲池使用管理器的CWnd继承控件,该管理器可以帮助我们减少在特定UI场景中GDI资源的使用。为了在运行中演示这些类,我已经在此提供了一个MDI应用示例,它只是让你来打开XML文件。每个XML文件为单个MDI子窗体定义了布局和UI控件属性。尽管代码是用VC6写的,示例项目也可以被转换为VS 2003 和VS 2005项目。

UI场景

这里有两个普通的UI场景可能从空闲池的概念中受益。第一个例子是一个允许操作员来控制一些不同类型的远程设备的网络管理应用程序。每个设备有一组可以被几乎实时地读取或设置的参数。对于这种类型的应用程序有一个可能的UI模式是你的基本MDI框架允许你打开一个MDI子窗体以控制单个设备实例。因为每个设备可能有众多的(数以十计或甚至数以百计)参数,每个MDI子(或设备)窗体中的UI控件用如下图所示标签被组织为逻辑上的分组。

为每个设备类型实现UI的典型方法是为每个标签创建控件的一个不同的对话框或属性页。这个方法实现起来简单但是它不能很好地工作。考虑这样一个状况:你需要支持一个有着200个参数的设备类型。假定在一个设备窗体中每个标签可以为最多20个参数的控件提供的一个布局。因此,需要创建10个标签或对话框。现在,如果你认为每个参数也许需要配以它自我描述的文本标签,那么表示完整设备所必需的UI控件的数量可能会超过400个。另外,对于特定参数,UI控件可能并不是像你的基本CButton或CEdit那样简单。它也许可能是一个第三方测量的ActiveX控件(你必需在你的项目用到的),或一个类似于Windows Forms用户控件的聚集。因此,必需实现单个设备窗体的GDI资源耗费可能会很高并在操作员需要在同一时间打开很多这些设备窗体时变成一个限制的因素。

第二个例子是选项对话框(比如在VS2005中的“选项(Options)”对话框)。这一类型对话框的代表是在左手边包含一个树视图,右边是一组UI控件。每当树视图中的选择项改变,右手的那组控件就会动态改变。这个UI场景实际上与有着标签设备常窗体的第一个例子很相似。主要的不同之处是在选择和分组机制上(例如,树视图选择对应标签选择)。

CWnd空闲池

去除对不同的对话框或属性页的需要是减少标签设备窗体的资源需求的一个方法。可以通过只用一个对话框并实现一个机制,并由此依靠当前选择了哪一个标签决定UI控件被隐藏或显示。相同数量的UI控件需要被创建,但是我们以对话框所需要的数量保存这些控件。

如果我们认识到相同类型的UI控件常常在多个标签中被显示,那就可以在资源使用中获得更大节约。换句话说,不是只在标签选择改变时隐藏控件,我们可以在空闲池或cache中存储隐藏控件以便它们可以在转换到一个不同标签时被复用。这允许我们通过标签选择复用UI控件实例。举个例子,如果一个标签使用了一个CButton和另一个标签也使用一个CButton,为这两个标签它应该只需要创建一个CButton的实例并使用相同的UI实例。用此方法,每个设备窗体所需UI控件节约的数量会是相当大的。正如最佳案例场景的一个例子,考虑一个有者10个参数组(标签)和200个参数的设备,每个参数用一个trackbar(滑块)控件表示。如果我们也要用一个相应的文本标签控件为每个trackbar配对,这时就需要总数400个UI控件使用一个典型的多对话框实现。然而,如果我们从一个标签到另一个标签复用trackbar和label控件,设备窗体将需要至少20个trackbar和20个label控件,由此可以10倍减少资源的使用。

为了实现复用机制,我们首先通过定义一个只是保存空闲和可利用的CWnd实例track的CWndFreePool类。池中引用的每个CWnd配以一个字符串标识与UI控件的类型相应的CWnd。比如,"Button"类型字符串标识配对CWnd实际上是一个CButton实例,(以BS_PUSHBUTTON样式创建的)。除了MFC内建控件比如CButton,空闲池也可以引用ActiveX控件,因为Visual Studio可以为继承于CWnd的ActiveX控件生成MFC包装类。CWndFreePool类的public接口如下所示。

// CWndFreePool保持引用到已被创建但没有使用的(隐藏)的CWnds。
//该池包括仍在池中的CWnds的所有者并在其析构体删除它们中。
class CWndFreePool
{
   public:
   //构造器/析构器
   CWndFreePool();
   ~CWndFreePool();
   // Public 方法。
   CWnd* GetWnd(const CString& strType);
   voidAddWnd(const CString& strType, CWnd* pWnd);
};

时间: 2024-12-02 10:58:12

使用一个CWnd空闲池创建一个动态用户界面的相关文章

vpn server amdroid-如何在android 设备上创建一个vpn server

问题描述 如何在android 设备上创建一个vpn server 怎么创建一个手机端的 vpn server,怎么创建啊 找了好多 就只有client的 解决方案 用openvpn.建立server

1.3、Android Studio创建一个Android Library

一个Android Library结构上与Android app模块相同.它可以包含构建一个app需要的所有东西,包括圆满,资源文件和AndroidManifest.xml.然而,并非编译成运行在设备上的APK,一个Android Library编译成其他Android app模块可以用作以来的AAR文件. 一个Library模块在以下情形中是有用的: 1. 当你构建多个使用相同组件,比如activity.service或者UI布局,的APP. 2. 当你构建的APP存在多个APK文件.比如免费

Powershell小技巧之创建一个新对象_PowerShell

下面是一个简单有效的创建一个自定义对象的方法: 复制代码 代码如下: $object = [PSCustomObject]@{   Name = 'Weltner'   ID = 123   Active = $true } 这将产生一个含初始值的对象: 复制代码 代码如下: PS> $object   Name                                                ID                    Active ----            

PS网页设计教程XV——如何在Photoshop中创建一个充满活力的作品集的网页设计

作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试翻译这些优秀的教程.因为翻译能力有限,翻译的细节上还有待推敲,希望广大网友不吝赐教. 约定: 1.本文的软件是Photoshop CS5版本 2.原教程的截图是英文的,本人在重新制作的基础上,重新截了中文版的图 3.原文中有些操作没有给出参数.本人在反复测试的情况下测定了一些参数,以红色的

mfc 动态创建窗口-一个CWnd对象的onpaint函数中,动态Create两个子窗口时造成wincore.cpp中的断言错误。

问题描述 一个CWnd对象的onpaint函数中,动态Create两个子窗口时造成wincore.cpp中的断言错误. 一个对话框子类CViewDlg 在onpaint函数中需要再动态创建两个子窗口 void CViewDlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 CRect rect; GetClientRect(&rect); m_wnd1->Create

javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象_javascript技巧

如果我们在客户端频繁使用ajax技术,那么我们就不得不多次创建xmlhttp对象.当然,如您所知,我们可以改进创建的方式,比如使用全局变量来缓存一个实例(客户端的单例模式?!),对于同步方式的通信,这是很有效的,但是这样的方式对于异步通信会出现问题,因为没有了进程的堵塞,用户可能在上一次通信未完成时再次调用同一个xmlhttp实例,这样不等前一个调用的回调函数触发,前一次调用就被"覆盖"掉了(也就代表前一次调用失败).建立一个保持xmlhttp实例的池,好处显而易见,最明显的优点就是我

bitmap-在Bitmap或者OVERLAYING按钮上如何动态的创建一个按钮

问题描述 在Bitmap或者OVERLAYING按钮上如何动态的创建一个按钮 我想在视图的 BITMAP或者OVERLAYING按钮上面创建一个按钮.我创建了一个数字签名,签名后,我需要点击一个按钮来保存.我使用的如下代码 public class FingerPaint extends GraphicsActivity implements OnClickListener { private TextView pauseButton;protected void onCreate(Bundle

System Center Virtual Machine Manager创建一个新的逻辑网络和IP池

System Center Virtual http://www.aliyun.com/zixun/aggregation/39569.html">Machine Manager是一套全面的管理解决方案,通过管理控制台可以管理运行在Windows Server 2008 withHyper-V.Virtual Server 2005 R2以及VMware ESX上的虚拟化基础架构.最近,Windows Server 2008 R2已经发布,该产品中包含了基础Hypervisor平台--Hy

如何在MFC对话框程序中动态创建一个单文档。

问题描述 如何在MFC对话框程序中动态创建一个单文档. 就是在MFC对话框程序里单击一个按钮可以出现一个单文档界面,是MFC对话框的框架 解决方案 再做一个单文档的exe,点击按钮,启动它