主要针对有一定Windows编程经验的读者。阅读本文需要对COM机制有一定的了解,最好掌握C++的STL,熟悉模板机制。本文假定您使用的是Visual C++(6.0以上版本),并正确安装了WTL 7.0和完整的ATL(Visual C++组件),如果您没有安装Visual C++,请跳过本文;如果您没有安装WTL 7.0,请看这里。

第0章 WTL介绍

ATL想必大家都不陌生,用VC写COM或COM+组件,ATL能够帮助我们完成不少工作。我个人比较喜欢ATL的运作方式——实际上,除了初学COM时编写的几个示例组件之外,我几乎没有完全手工地起草过COM的C++源代码——因为ATL已经完成了这些工作。

如果您不熟悉ATL的话,在这儿我先简单地介绍一下它。ATL是一组C++模板库,最初设计它的目的为编程人员提供一个快捷的途径来编写快而小的COM组件。早期,它特别为实现多层次企业解决方案中的商业逻辑和数据访问的自动化组件而设计。最初的ATL版本中不包括对于界面的支持,但在2.0中,ATL开始包括那些用来支持界面控件的机制。

与MFC相比,ATL最大的优势就在于它是使用模板,而不是类继承实现的。当然它也有不足之处,即它不像MFC那样容易编写界面。通常的应用中,ATL被用来编写非界面的组件,例如,OLE DB、安全验证组件,等等。

对于我本人来说,ATL的优势是非常明显的。MFC需要一些额外的消耗,因为MFC需要支持界面的种种操作,需要支持许多我并不需要的特性(至少是所写的程序中不需要),而由于采用的是类继承,这些额外的设施将不得不被包括到最终的代码中。静态连接MFC库需要增加数百KB,而动态连接,尽管能够有效地减小程序体积,但作为换汤不换药的机制,仍然需要消耗比较多的内存。通常对于组件而言,希望额外的东西越少越好——如果我不需要在屏幕上显示窗口,那么窗口支持就是多余的;如果我不需要处理鼠标事件,那么这段代码就是多余的;而多余的代码最好干脆不要出现。典型的网站服务中,更少的内存占用无疑意味着更大的承载能力。

对于那些希望有良好界面的应用程序开发人员来说,ATL的上述优势的吸引力也许并不大。然而,ATL的许多特性,特别是允许编写更小、更快的代码(与MFC相比),以及对于COM的与生俱来的支持,促使Microsoft在ATL中加入了对编写普通Windows程序的支持。

按照Microsoft的说法,WTL是使用了这些支持的对ATL的一组扩展。它包括了一组扩展ATL的类,使它能够支持更为复杂的,包括应用程序和各种用户界面组件,同时保持ATL最大的好处——能够编写小而快的代码。WTL的目标是成为最好和最简单的实现基于Win32和ATL的应用程序、服务器和控件的方法。

尽管WTL现在还不能像MFC那样方便地用来编写应用程序,但它已经足以在许多地方替代MFC,当然,使用它的开发者也就同时得到了它所带来的好处——紧凑而高效的代码。随着基于HTML页面制作程序界面这一新兴潮流的兴起,使用WTL将不再是一种“另类”的做法。

在本系列的文章中,我将一步一步地带领大家实现一个采用HTML页面作为界面的应用程序。如果你是一个网页设计高手的话,那么你将很快地发现制作一个漂亮的Windows应用程序是如此的得心应手;即使您原来非常熟悉Windows应用程序的界面设计,您也会发现,使用HTML来设计程序界面是一个不错的主意——它将极大地缩短界面的设计时间,并且,与您处于同一个开发组的其他设计人员将能够更容易地帮助您做好界面设计工作,因为编写HTML界面不需要特别的程序设计经验。

第1章 WTL入门

不熟悉COM、ATL都没有关系,因为WTL是一件容易学会的工具。下载之后,执行自解压程序,它将会把WTL复制到你的硬盘上的某个位置。随后,执行与VC版本对应的AppWizard安装程序(一个js文件),并在VC环境中适当地配置Include文件的位置就可以开始使用WTL了。

在开始写程序之前,我还需要唠叨一些关于WTL中宏定义。与MFC一样,ATL/WTL也使用了宏。我并不打算介绍全部这些宏,但几个常用的无疑能够帮助你理解WTL向导生成的代码:

宏名称

描述

ALT_MSG_MAP

标记新的ATL消息映射的开始

ATLASSERT

ATLASSERT宏将执行与C运行环境库中_ASSERTE宏同样的功能

ATLTRACE, ATLTRACE2

在诸如调试窗口的输出设备中显示信息,具体显示什么与调试状态和级别有关。ATLTRACE2是目前推荐的宏,而ATLTRACE主要是为了兼容以前的代码

BEGIN_MSG_MAP

标记默认消息映射的开始

CHAIN_MSG_MAP, CHAIN_MSG_MAP_ALT, CHAIN_MSG_MAP_ALT_MEMBER, CHAIN_MSG_MAP_DYNAMIC, CHAIN_MSG_MAP_MEMBER, COMMAND_HANDLER, MESSAGE_HANDLER, MESSAGE_RANGE_HANDLER

定义一个消息映射项目

DECLARE_WND_CLASS

指定新窗口类的名字。通常在ATL ActiveX控件的控制类中使用

END_MSG_MAP

标记消息映射的结束

WM_FORWARDMSG

将消息转发到别的窗口

以及几个智能指针类,以及我们可能会用到的ATL类。智能指针类可以帮助你更好地撰写程序,并避免内存泄漏等问题。

描述

CAtlWinModule

(ATL 7)为所有需要窗口特性的ATL提供支持的类

CAtlExeModuleT

包括用于创建EXE文件所需要的代码的类

CAtlFile

对Windows文件API进行的封装的类

CAtlFileMapping

对Windows内存映射文件API进行封装的类(限于篇幅,我不打算对这个类的内部构造进行详细介绍)

CAutoPtr

普通的智能指针类

CAutoPtrArray

用于建立智能指针数组

CAutoPtrList

用于建立智能指针表

CAutoVectorPtr

用于建立智能指针向量(类似C++ vector)

CAxWindow

管理作为ActiveX控件宿主窗口的类

CComBSTR

对于BSTR(类似Basic字符串,限于篇幅将不作详细介绍)的封装

CComPtr

管理COM接口指针的智能指针类

CComQIPtr

同上。具体区别将在后文介绍

CComVariant

对于VARIANT类型的封装

CWindow

管理窗口

CWindowImpl

创建和继承窗口

限于篇幅,我不打算介绍WTL的类——除非在后面的文字中提到它们。这里列出它们的名字,WTL的类包括CAppModule,CServerAppModule,CMessageLoop,CMessageFilter,CIdleHandler,CFrameWindowImplBase,CFrameWindowImpl,COwnerDraw,CDialogResize,CMDIWindow,CMDIFrameWindowImpl,CMDIChildWindowImpl,CUpdateUIBase,CUpdateUI,CStatic,CButton,CListBox,CComboBox,CEdit,CEditCommands,CScrollBar,CImageList,CListViewCtrl,CTreeViewCtrl,CTreeItem,CTreeViewCtrlEx,CHeaderCtrl,CToolBarCtrl,CStatusBarCtrl,CTabCtrl,CToolTipCtrl,CToolInfo,CTrackBarCtrl,CUpDownCtrl,CProgressBarCtrl,CHotKeyCtrl,CAnimateCtrl,CRichEditCtrl,CRichEditCommands,CDragListBox,CDragListNotifyImpl,CReBarCtrl,CComboBoxEx,CDateTimePickerCtrl,CFlatScrollBarImpl,CFlatScrollBar,CIPAddressCtrl,CMonthCalendarCtrl,CCustomDraw,CPropertySheetWindow,CPropertySheetImpl,CPropertySheet,CPropertyPageWindow,CPropertyPageImpl,CPropertyPage,CAxPropertyPageImpl,CAxPropertyPage,CFileDialogImpl,CFileDialog,CFolderDialogImpl,CFolderDialog,CFontDialogImpl,CFontDialog,CRichEditFontDialogImpl,CRichEditFontDialog,CColorDialogImpl,CColorDialog,CPrintDialogImpl,CPrintDialog,CPrintDialogExImpl,CPrintDialogEx,CPageSetupDialogImpl,CPageSetupDialog,CFindReplaceDialogImpl,CFindReplaceDialog,CMenu,CDC,CPaintDC,CClientDC,CWindowDC,CPen,CBrush,CFont,CBitmap,CPalette,CRgn,CCommandBarCtrlImpl,CCommandBarCtrl,CBitmapButtonImpl,CBitmapButton,CCheckListViewCtrlImpl,CCheckListViewCtrl,CHyperLinkImpl,CHyperLink,CWaitCursor,CMultiPaneStatusBarCtrlImpl,CMultiPaneStatusBarCtrl,CPaneContainerImpl,CPaneContainer,CScrollImpl,CScrollWindowImpl,CMapScrollImpl,CMapScrollWindowImpl,CSplitterImpl,CSplitterWindowImpl,CSplitterWindow,CTheme,CThemeImpl,CPrinterInfo,CPrinter,CDevMode,CPrinterDC,CPrintJobInfo,CPrintJob,CPrintPreview,CPrintPreviewWindow,CSize,CPoint,CRect,CString,CWinDataExchange,CRecentDocumentList。许多类对于MFC程序员来说是非常熟悉的,仅从类名我们就可以看出,WTL具有相当强大的界面支持。与MFC不同,WTL并不是一个框架——它不强加任何应用程序模型,并能够适应几乎所有的应用程序模型。WTL基本上是模板库,这不仅意味着它包括了全部源代码,并且,也意味着只需要实例化使用到的那些数据结构和内联函数,从而得到尽可能小的代码。

第2章 使用WTL应用程序向导

Visual C++ 7和Visual C++ 6中的WTL应用程序向导的界面差异比较大(内容相同)。为了创建一个支持HTML界面的应用程序,需要作如下选择:

92916_2152652_4.gif

首先是选择WTL应用程序向导,然后

92916_2152652_5.gif

选择SDI应用程序,最后,

92916_2152652_6.gif

将View窗口的类型选定为HTML Page,并去掉Toolbar, Rebar, Command Bar, Status Bar这些特性。

假定我们在第一步中输入的工程名称为webui,则我们将拿到一组文件:stdafx.cpp、stdafx.h(这个就不用说了吧?),webui.cpp(程序实现),MainFrm.h(CMainFrame类),webuiView.h(CWebuiView类),AboutDlg.h(CAboutDlg类),resource.h(资源定义),以及一组资源文件。

现在程序已经可以运行了,其界面类似下图:

92916_2152652_7.png

其中,白色部分将出现Microsoft的主页,如果连着网的话。

接下来的部分中,我将拆开向导生成的这些源代码,并介绍其执行过程。

wtl中显示html,用WTL构建HTML界面应用程序(1)相关推荐

  1. ISE中显示IP核的图形化界面

    在学习别人的Verilog代码时,常常会遇到人家设置好的IP核,但是自己要用.v文件看,非常麻烦.百度了很多也没有满意的结果,最后终于找到了方法,现贴出来,希望可以解决很多跟我有同样困惑的同学 比如例 ...

  2. LabVIEW主VI前面板中显示或使用多个子VI

    LabVIEW主VI前面板中显示或使用多个子VI 想在程序中连接一个或多个子VI的前面板,但是当调用它们时,每个子VI在计算机屏幕上显示为一个新窗口.那么怎么能让每个子VI作为主VI前面板的一部分进行 ...

  3. C++零食:WTL中使用双缓冲避免闪烁

    双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板.首先我们在内存环境中建立一个"虚拟"的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制 ...

  4. node mongoose_如何使用Express,Mongoose和Socket.io在Node.js中构建实时聊天应用程序

    node mongoose by Arun Mathew Kurian 通过阿伦·马修·库里安(Arun Mathew Kurian) 如何使用Express,Mongoose和Socket.io在N ...

  5. 在docker中构建普通java程序_Docker入门-构建第一个Java程序

    原标题:Docker入门-构建第一个Java程序 定制镜像 准备一个没有第三方依赖的java web项目,可能参考示例maven结构项目: session-web.war 把该war上传到安装有doc ...

  6. Unity 3D:在现有的Android游戏场景中显示AdMob的横幅

    2019独角兽企业重金招聘Python工程师标准>>> 关于如何在现有的Android项目现场显示AdMob的横幅,在一个Android项目中使用一个简单的Android JAR文件 ...

  7. listview显示mysql数据_C#在listview控件中显示数据库数据

    一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 ...

  8. 解决 IntelliJ IDEA 内置的 Tomcat 日志中显示的中文乱码

    解决 IntelliJ IDEA 内置的 Tomcat 日志中显示的中文乱码 方法 1 方法 2(不推荐) 笔者的环境: JDK 13.0.2 Maven 3.6.3 Tomcat 9.0.41(Se ...

  9. 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

    前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...

最新文章

  1. tomcat android https,tomcat 配置 https, android端 访问
  2. 160个Crackme038之P-Code初窥门径
  3. mysql GRANT
  4. MFC中Combo 下来菜单不能展开(只显示一点点)
  5. 【STM32】USART收发---内嵌中断向量控制器
  6. 2018年AI要怎么“玩”?李飞飞和李开复在达沃斯论坛上给出这几点…
  7. 装饰博客全攻略(如何在博客首页或博客中插入图片、音乐、视频等)
  8. 交换机和路由器的区别计算机网络,交换机和路由器有什么区别?路由器与交换机的区别知识...
  9. C语言零碎知识点之输入字符数组
  10. TUP首期主题论坛报道:中小型开发商移动开发的生存之道
  11. 阻止计算机病毒入侵系统,入侵预防系统
  12. 你被抖音“魔性”的设计风格洗脑了吗?
  13. 爬虫大作业~以爬取hao123漫画为例
  14. 看视频可以倍速播放的(主流播放器都可以)
  15. 数值分析-有关迭代法
  16. Java调用命令行+java生成词云
  17. Axios源码深度剖析
  18. 夜深模拟器调试下载的app
  19. 烈焰 页游 一键端 单机自玩 架设
  20. php对接短信宝,DEDECMS短信宝短信插件

热门文章

  1. 【每日一算法】实现strStr()
  2. 数据统计之日增用户统计
  3. 王爽老师的汇编语言 实验8 jmp是如何实现跳转的
  4. servlet里面的context,定义属性值的事情!
  5. 有意思的。带情感的语音转换,可以下载!
  6. R-C3D 视频活动检测
  7. OpenCV4 部署DeepLabv3+模型
  8. 小程序:位置信息(Location)及微信小程序LBS解决方案实践
  9. 我是架构师-设计模式-工厂模式-工厂方法
  10. linux下gdb所有实用方法