MFC程序员WTL指南(5)对话框与控件

对第四章的介绍

MFC 的对话框和控件的封装真得可以节省你很多时间和功夫。没有MFC对控件的封装,你要操作控件就得耐着性子填写各种结构并写很多的SendMessage调用。MFC还提供了对话框数据交换(DDX),它可以在控件和变量之间传输数据。WTL 当然也提供了这些功能,并对控件的封装做了很多改进。本文将着眼于一个基于对话框的程序演示你以前用MFC实现的功能,除此之外还有WTL消息处理的增强功能。第五章将介绍高级界面特性和WTL对新控件的封装。

回顾一下ATL的对话框

现在回顾一下第一章 提到的两个对话框类,CDialogImpl 和 CAxDialogImpl。CAxDialogImpl用于包含ActiveX控件的对话框。本文不准备介绍ActiveX控件,所以只使用CDialogImpl。

创建一个对话框需要做三件事:

  1. 创建一个对话框资源
  2. 从CDialogImpl类派生一个新类
  3. 添加一个公有成员变量IDD,将它设置为对话框资源的ID.

然后就像主框架窗口那样添加消息处理函数,WTL没有改变这些,不过确实添加了一些其他能够在对话框中使用得特性。

通用控件的封装类

WTL有许多控件的封装类对你应该比较熟悉,因为它们使用与MFC相同(或几乎相同)的名字。控件的方法的命名也和MFC一样,所以你可以参照MFC的文档使用这些WTL的封装类。不足之处是F12键不能方便地跳到类的定义代码处。

下面是Windows内建控件的封装类:

  • 用户控件: CStatic, CButton, CListBox, CComboBox, CEdit, CScrollBar, CDragListBox
  • 通用控件: CImageList, CListViewCtrl (CListCtrl in MFC), CTreeViewCtrl (CTreeCtrl in MFC), CHeaderCtrl, CToolBarCtrl, CStatusBarCtrl, CTabCtrl, CToolTipCtrl, CTrackBarCtrl (CSliderCtrl in MFC), CUpDownCtrl (CSpinButtonCtrl in MFC), CProgressBarCtrl, CHotKeyCtrl, CAnimateCtrl, CRichEditCtrl, CReBarCtrl, CComboBoxEx, CDateTimePickerCtrl, CMonthCalendarCtrl, CIPAddressCtrl
  • MFC中没有的封装类: CPagerCtrl, CFlatScrollBar, CLinkCtrl (clickable hyperlink, available on XP only)

还有一些是WTL特有的类:CBitmapButton, CCheckListViewCtrl (带检查选择框的list控件), CTreeViewCtrlEx 和 CTreeItem (通常一起使用, CTreeItem 封装了HTREEITEM), CHyperLink (类似于网页上的超链接对象,支持所有操作系统)

需要注意得一点是大多数封装类都是基于CWindow接口的,和CWindow一样,它们封装了HWND并对控件的消息进行了封装(例如,CListBox::GetCurSel()封装了LB_GETCURSEL消息)。所以和CWindow一样,创建一个控件的封装对象并将它与已经存在的控件关联起来只占用很少的资源,当然也和CWindow一样,控件封装对象销毁时不销毁控件本身。也有一些例外,如CBitmapButton, CCheckListViewCtrl和CHyperLink。

由于这些文章定位于有经验的MFC程序员,我就不浪费时间介绍这些封装类,它们和MFC相应的控件封装相似。当然我会介绍WTL的新类:CBitmapButtonCBitmapButton类与MFC的同名类有很大的不同,CHyperLink则完全是新事物。

用应用程序向导生成基于对话框的程序

运行VC并启动WTL应用向导,相信你在做时钟程序时已经用过它了,为我们的新程序命名为ControlMania1。在向导的第一页选择基于对话框的应用,还要选择是使用模式对话框还是使用非模式对话框。它们有很大的区别,我将在第五章介绍它们的不同,现在我们选择简单的一种:模式对话框。如下所示选择模式对话框和生成CPP文件选项:


第二页上所有的选项只对主窗口是框架窗口时有意义,现在它们是不可用状态,单击"Finish",再单击"OK"完成向导。

正如你想的那样,向导生成的基于对话框程序的代码非常简单。_tWinMain()函数在ControlMania1.cpp中,下面是重要的部分:

int WINAPI _tWinMain (
   HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/,
   LPTSTR lpstrCmdLine, int nCmdShow )
{
   HRESULT hRes = ::CoInitialize(NULL);
   AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
   hRes = _Module.Init(NULL, hInstance);
   int nRet = 0;
   // BLOCK: Run application
   {
     CMainDlg dlgMain;
     nRet = dlgMain.DoModal();
   }
   _Module.Term();
   ::CoUninitialize();
   return nRet;
}

时间: 2024-08-07 12:44:37

MFC程序员WTL指南(5)对话框与控件的相关文章

MFC程序员WTL指南(7)包容ActiveX控件

介绍 在第六章,我将介绍ATL对在对话框中使用ActiveX控件的支持,由于ActiveX控件就是ATL的专业,所以WTL没有添加其他的辅助类.不过,在ATL中使用ActiveX控件与在MFC中有很大的不同,所以需要重点介绍.我将介绍如何包容一个控件并处理控件的事件,开发ATL应用程序相对于MFC的类向导来说有点不方便.在WTL程序中自然可以使用ATL对包容ActiveX控件的支持. 例子工程演示如何使用IE的浏览器控件,我选择浏览器控件有两个好处: 每台计算机都有这个控件,并且 它有很多方法和

MFC程序员WTL指南(6)高级对话框用户界面类

第五章介绍 在上一篇文章我们介绍了一些与对话框和控件有关的WTL的特性,它们和MFC的相应的类作用相同.本文将介绍一些新类实现高级界面特性新类:控件自画和自定外观控件,新的WTL控件,UI updating和对话框数据验证(DDV). 特别的自画和外观定制类 由于自画和定制外观控件在图形用户界面中是很常用的手段,所以WTL提供了几个嵌入类来完成这些令人厌烦的工作.我接着就会介绍它们,事实上我们在上一个例子工程ControlMania2的结尾部分已经这么做了.如果你正随着我的讲解用应用程序生成向导

MFC程序员WTL指南(1)中文版序言

我一直在寻找这样一个类库:他对Windows的窗口提供面向对象的封装,有灵活的消息响应机制和比较完备的界面框架解决方案,对标准控件提供简练实用的封装,支持操作系统的新特性,支持功能扩充和二次开发,有代码自动生成向导机制,生成的程序使用较少的系统资源,最后是有完全的代码支持和文档支持. 你会说那就用MFC吧! 是的,我一直使用MFC,但我对MFC已经越来越厌倦了.陈旧的类库使得它无法支持操作系统的新特性(MFC的类库从4.21版之后就没有更新了,而那时是1998年,人们使用Windows 95和w

MFC程序员WTL指南(4)工具条与状态条

对第三部分的介绍 自从作为Windows 95的通用控件出现以来,工具条和状态条就变成了很普遍的事物.由于MFC支持浮动的工具条从而使它们更受欢迎.随着通用控件的更新,Rebars(最初被称为Coollbar)使得工具条有了另一种展示方式.在第三部分,我将介绍WTL对这些控制条的支持和如何在你的程序中使用它们. 主窗口的工具条和状态条 CFrameWindowImpl有三个HWND类型的成员变量在窗口创建时被初始化,我们已经见过m_hWndClient,它是填充主窗口客户区的"视图"窗

MFC程序员WTL指南(2)ATL界面类

在你开始使用WTL或着在本文章的讨论区张贴消息之前,我想请你先阅读下面的材料. 你需要开发平台SDK(Platform SDK).你要使用WTL不能没有它,你可以使用在线升级安装开发平台SDK,也可以下载全部文件后在本地安装.在使用之前要将SDK的包含文件(.h头文件)和库文件(.Lib文件)路径添加到VC的搜索目录,SDK有现成的工具完成这个工作,这个工具位于开发平台SDK程序组的"Visual Studio Registration"文件夹里. 你需要安装 WTL.你可以从微软的网

MFC程序员WTL指南(3)WTL界面基类

对第二部分的介绍 好了,现在正式开始介绍WTL!在这一部分我讲的内容包括生成一个基本的主窗口和WTL提供的一些友好的改进,比如UI界面的更新(如菜单上的选择标记)和更好的消息映射机制.为了更好地掌握本章的内容,你应该安装WTL并将WTL库的头文件目录添加到VC的搜索目录中,还要将WTL的应用程序生成向导复制到正确的位置.WTL的发布版本中有文档具体介绍如何做这些设置,如果遇到困难可以查看这些文档. WTL 总体印象 WTL的类大致可以分为几种类型: 主框架窗口的实现- CFrameWindowI

MFC程序员WTL指南(9)属性页与向导

介绍 甚至在成为Windows 95的通用控件之前,使用属性表来表示一些选项就已经成为一种很流行的方式.向导模式的属性表通常用来引导用户安装软件或完成其他复杂的工作.WTL对这两种方式的属性表都提供了很好的支持,可以使用前面介绍的与对话框相关的特性,如DDX和DDV.在本章我将演示如何创建一个基本的属性表和向导,如何处理属性页发送的通知消息和事件. WTL 的属性表类 实现一个属性表需要CPropertySheetWindow和CPropertySheetImpl两个类联合使用,它们都定义在at

MFC程序员WTL指南(8)分隔窗口

介绍 随着使用两个分隔的视图管理文件系统的资源管理器在Windows 95中第一次出现,分隔窗口逐渐成为一种流行的界面元素.MFC也有一个复杂的功能强大的分隔窗口类,但是要掌握它的用法确实有点难,并且它和文档/视图框架联系紧密.在第七章我将介绍WTL的分隔窗口,它比MFC的分隔窗口要简单一些.WTL的分隔窗口没有MFC那么多特性,但是易于使用和扩展. 本章的例子工程是用WTL重写的ClipSpy,如果你对这个程序不太熟悉,现在可以快速浏览一下本章内容,因为我只是复制了ClipSpy的功能而没用深

程序员健康指南---做出改变

1.做出改变      最近在学习技术的同时也在关注一本书<<程序员健康指南>>,我就把我的读书心得分享一下吧.      身体健康问题对于IT工作者来说应当非常重视,人们常说,久坐必会生病,其实这是正常的,我非常相信,因为我就是久坐从而长了小肚腩,为了保持健康,我也在不断的做出努力.早上喝淡盐水,中午莲子心茶,晚上睡眠敷胎菊花泡开的面膜,不定时进行锻炼.可能有人会这么说,大男人,没必要搞得跟个女孩一样的.我觉得现在这些健康问题都要去注意,不是男不男女不女的问题,男女都一样,都要保