介绍
本文提出了一组可以用来动态创建 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 场景实际上与有着标签设备常窗体的第一个例子很相似。主要的不同之处是在选择和分组
机制上(例如,树视图选择对应标签选择)。