天天看點

[翻譯]WTL開發者指南 第1章 WTL概述

WTL開發者指南

注:本文是袁曉輝根據Eamon O’ Tuathail的WTL Developer’s Guide(www.clipcode.biz ) 翻譯而來,釋出在www.farproc.com。作者翻譯本文僅僅是為自己和其他WTL愛好者學習之用,請勿用于商業用途。你可以轉載本文,但必須保證本文的完整性,并保留該聲明!

第1章 WTL概述

目标

該章的目标為:

Ÿ       WTL在整個VC++開發中所處的位置

Ÿ       WTL的目标

Ÿ       WTL和其他使用者界面(UI)開發技術的對比

Ÿ       介紹WTL的安裝

Ÿ       介紹WTL安裝了什麼

Ÿ       列舉可用的開發資源

Ÿ       對後面各章的介紹

概述

以前Visual C++開發者往往選擇MFC,因為它提供的功能涵蓋了非常廣的程式設計技術領域而模闆庫所涉及的領域相對狹窄。

最近模闆庫涉足的領域和品質都有很大發展,因而越來越多的人選擇了模闆庫。

ATL設計的目标是提供快速緊湊的COM元件,ISO C++的STL提供集合(collections),VC++ OLE DB Data Consumer and Provider模闆提供資料庫支援。與之相對應,MFC提供了一個C++類庫,這個類庫包含對COM建立、集合類(collection class)、資料庫和使用者界面的普遍支援。

大部分的進階開發人員更喜歡較新的模闆開發方式。MFC很龐大、臃腫、對線程不友好,并且,基本上已經過時了!模闆的方法既快速(當正确設計時)、有彈性而且涵蓋了所有最新的技術,拿來應對新的開發需要是再好不過的了。

到目前為止,讓模闆狂熱分子頭疼的主要問題在于如何建立圖形使用者界面(GUI)。ATL确實提供了一個輕量級的Win32/64 windowing 包裝類,但是它并沒有涵蓋所有的UI需求。ATL開發者為了瑣碎的使用者界面處理不得不重操MFC UI程式設計或者用VB給自己的ATL COM做前端,這兩種方法都不能完全令人滿意。

進入正題,開始說視窗模闆庫(Windows Template Library)。WTL是一個居于Win32/64 API之上的一個包裝類和友善易用的增強模闆的進階集合,它對圖形使用者界面提供了廣泛的支援。WTL不但保持着模闆庫的真正血統,小巧,快速,不具侵入性而且包括了最新的UI理念,非常好地支援多線程。你可以單獨使用WTL或和ATL、STL、VC++ Data Templates、第三方類庫,以及你自己的類庫一起使用以便利用他們各自的優點。WTL通常不依賴外部的DLLs,如果你用WTL開發程式的話,你提供給最終使用者的可以隻有一個EXE檔案。

WTL的目标

WTL之于使用者界面就像ATL之于COM、STL之于collection。和它的堂兄一樣,WTL需要一段時間來學習,但是一旦掌握了,就沒有比它更好的開發進階程式的途徑了。從本質上說,WTL完成了三個重大任務:

    提供了一個應用程式架構(framwork)

    集合了UI功能

    包裝了windows控件、系統對話框和GDI對象

讓我們逐個來看。

提供了一個應用程式架構

WTL提供了一個輕量級的廣泛的應用程式架構,這個架構為基于它的程式提供了非常有價值的工具。它的目标既不是像MFC架構那樣難以了解也不像手工寫WinMain那樣原始。

WTL包含了一系列的C++模闆和一個WTL AppWizard,AppWizard向程式開發者提出幾個問題,然後據此生産VC++工程和程式源代碼,源代碼裡多數是WTL模闆類的執行個體或繼承類。一般來說,開發者僅僅需要改變AppWizard生産的代碼,而那些很少需要改動的“樣闆”式的代碼都被WTL模闆封裝了。

WTL中有一個管理整個子產品(一個DLL或EXE)的類,這個類在AppWizard生成的代碼中執行個體化,在自動生成的WinMain中被初始化和終結。一個WTL程式也可以作為COM server,支援可程式設計的應用程式。WTL提供了消息處理機制,支援消息過濾和空閑(on-idle)功能,WM_SETTINGCHANGE引發的改變通知也可以被截獲。

MFC提供了一個“文檔-架構-視圖”結構,WTL也提供架構(比如一個包括菜單條、工具條和狀态條的頂層視窗)和視圖,但是根本不支援文檔。MFC的那套方法往往妨礙進階的開發者,它的文檔是基于二進制資料的序列化(serialize),在當今網際網路的世界裡,基于XML/XSL的文檔格式越來越流行,對于彈性化存儲機制的需求也越來越多(可能根本就不是存儲在本地磁盤上的),文檔可能需要運用大量的遠端機制,比如WebDAV,FTP等,進行存儲。WTL沒有提供任何關于資料或存儲格式的功能和機制,程式開發者可以自己編寫代碼,比如利用高效的Win32 API WriteFileGather/ReadFileScatter或XML解析器來根據需要做這些工作。

WTL支援基于對話框的程式,單文檔界面(SDI)和多文檔界面(MDI)。對于SDI它同樣支援多線程SDI,每個SDI視窗一個線程,多數進階的應用程式很有可能用到這種構架(比如,模仿Word2000的方法)。WTL不支援多線程MDI構架,即不支援一個MID子視窗一個線程,但這是可以了解的,比如這樣可以避免線程和MDI父子視窗之間互動的許多問題。

集合了UI功能

WTL提供了一組實作現代的使用者界面所必不可少的特性。

WTL提供了一個架構視窗用于管理一個包含了指令條(增強的菜單條)、工具條的rebar,一個狀态條,一個或多個視圖(views)。視圖可以基于一個普通的空視窗RechEidt,ListView,TreeView之類的控件。如果使用了多個視圖,WTL的分割功能就派上用場了,視圖也支援滾動,狀态條可以是一個pane或多個panes。

WTL也支援傳統的菜單條和工具條,但是它的主菜單表現概念是基于指令條的。一個指令條可以容納菜單和工具條圖示,可以放在一個rebar裡顯示并四處移動。如果一個菜單項目和一個工具條按鈕擁有同樣的指令ID的話,菜單項目旁邊會自動顯示對應的圖示。WTL支援可停泊或浮動的指令條,WTL的指令條和Internet Explorer中的很像但和Word2000或Visual Studio的(更令人向往)不一樣,WTL不支援可以隐藏不常用的項目的菜單(比如Word2000的)。動态資料交換的概念允許資料在可見的UI控件和C++資料成員之間雙向傳遞,和MFC的DDX很相近。可以用ATL生成對話框,包括那些支援ActiveX控件和視窗容器,利用Visual C++的Resource View可以用來在對話框資源上布局标準控件、通用控件和ActiveX控件,利用ATL Window Message Handler Wizard來映射這些控件的消息。

WTL提供了用來管理屬性薄、屬性頁建立和向導建立的模闆建立。

列印機裝置場景、列印預覽、devmode處理和列印作業管理功能可以用來實作文檔列印。

使用特殊的裝置場景、檔案管理器和增強metafile資訊類可以支援增強的metafile。

包裝了windows控件、系統對話框和GDI對象

ATL提供了對普通視窗的控制但是沒有提供對基于不同視窗類的視窗的特殊支援,開發者不得不根據需要手工編寫SnedMessage調用。對于和Edit或TreeView的通訊他們不得不使用ATL的CWindow并且調用Win32的SendMessage以EM_LIMITTEXT或VM_SETITEM還得擔心消息的參數是否正确(SendMessage沒有類型檢查,全部為WPARAM,LPARAM)。當程式接收到它們時也是“裸資料”- wParam和lParam被送到了消息隊列,必須通過代碼來轉換資料為合适的類型,這時還得保證轉換對于每個消息是正确的

一些ATL開發者都使用從ATLCON例程中提取出的代碼,這些代碼提供了對Windows UI 元素的一些封裝封裝。WTL現在以及進化出了一整套的廣泛的封裝類,這些類實作了對所有标準和通用視窗控件、系統對話框和所有GDI對象以及其他的封裝。WTL中無論是對edit,button,listbox,treeview,listview等還是對通用檔案對話框、顔色對話框、字型對話框等還是對DC,pen,brush,region,font等都有對應的包裝類。

另外,WTL還提供了一整套的message crackers,進入視窗的消息被映射到指定的處理函數。使用ATL時,消息處理函數收到的是lParam和wParam,而使用WTL的message cracker,消息處理函數的參數都是具體消息的具體類型。比如:WM_LBUTTONDOWN消息有一個CPoint類型的參數(CPoint是WTL對Win32 POINT結構的包裝-WTL包裝了每一個通用的結構)。注意,ATL Windows Message Handler Wizard 使用ATL的原始消息映射,非WTL的message crackers,VC++下一版可能對向導支援會好一些。

許多的開發者選擇MFC僅僅是為了使用CString,WTL自己也提供了對CString的實作,并且是幾乎和MFC一樣的實作。WTL的CString支援ASCII,MBCS,UNICODE和自動化的BSTR,支援這些類型間的互相轉換,支援字元串連接配接、截斷、和比較,支援printf一樣的格式化處理,支援彈性的記憶體管理。

WTL,ATL和Win32/64 API之間的關系

WTL是基于ATL和Win32、64API的,ATL是基于Win32/64 API的,當談到它們之間的關系時,我們應該從源代碼和二進制兩個視角來讨論。

源代碼

Win32/64 API是成千上百的C函數的集合,涵蓋了相當大的範圍,包括我們感興趣的COM和windowing。

ATL是C++模闆的集合,幾乎就是為COM程式設計量身定做的,但是也包括廣泛的底層windowing功能的支援。

[翻譯]WTL開發者指南 第1章 WTL概述

WTL是C++模闆的集合,它的關注點在高層的windowing功能,WTL不依賴于COM,但是可以和COM一起使用。隻要你不在WTL中選擇支援“Com Server”,CoInitialize就不會被調用。

WTL使用ATL的windowing服務,是以要使用WTL,你必須通路ATL模闆。

ATL調用Win32/64 API,WTL調用ATL模闆和Win32/64 API,你的程式代碼調用WTL,ATL和Win32/64 API。

當你運作了WTL AppWizard,他給你生成一些源檔案,這些源檔案将成為你程式代碼的一部分,這些生成的代碼調用WTL,建構程式架構。

WTL支援Windows 2000,Windows Me,Windows NT4,Windows 98,Windows95, OSR 2和“經典”windows 95,WTL并不是隻支援它們 “最小公分母”,而是提供#define(比如 _RICHEDIT_VER, _WIN32_IE, _WIN32_WINNT and WINVER)來決定使用那些Win32/64的特性。WTL不會自動判别被安裝到的作業系統的版本或IE的版本(比如,它不使用LoadLibrary /GetProceAddress 或GetVersionEx APIs來判别)。程式開發者必須指定#define宏,而且在編譯期間已經假定程式在正确版本的客戶機上可以正常運作,否則不能。

舉個例子,菜單中的“>>”符号(v型符号),當一個指令條因為視窗大小改變而被截短時如果不使用v型符号,超出視窗邊界的那部分指令條就别直接“剪掉”了。

V型符号是一個包含兩個大于号的标志,當被按下時,就彈出一個菜單菜單上包含由于視窗大小改變而被從指令條尾部截去的那些項目。如果包含了IE5,v型符号就被支援,反之不支援。

在WTL程式中,如果_WIN32_IE 别定義為0x0500或更高(比如,在stdafxh裡)那麼v型符号在必要時就會顯示。

二進制

ATL和WTL是作為一組包含C++模闆的頭檔案的形式釋出的。ATL中有少數的類可以作為一個獨立的DLL來使用,但是多數的程式員也把它們的源代碼包含到自己的工程裡面去,對于WTL程式來說,這也是被推薦的。WTL沒有可以作為獨立的DLL的東西,是以WTL的C++類(并非全部)将被包含進每個程式。當你編譯WTL程式,你最終會得到一個EXE或DLL,這就是你唯一需要傳遞最終使用者的程式,不依賴外部庫,當然除去作業系統自帶的DLL,比如kernel32.dll,但是這些庫基本上都存在(如果不存在,windows本身也許就無法正常工作了)。一個例外:如果你需要使用浮點數,你不得不使用C語言運作庫(CRT)。

WTL-ATL,MFC,VB,Java,DHTML等的抉擇

……(省略廢話數百字)

為什麼選擇WTL?

WTL不像MFC那樣笨重,最終的應用程式也比較小巧。對于進階程式,WTL給你使用API的機會,但是比純粹的API程式設計節省時間。

Win32 API可以直接使用,但是有時候它們看起來相當獨立,很難決定如何将它們結合起來使用。

WTL提供了更多的可以完成同樣操作的功能。

由于被調用的方法是在編譯期而不是運作期決定的,這就是它在效率和代碼規模方面占有優勢,模闆庫正在變得越來越流行。

安裝WTL

WTL的發展很快,它的發行機制也在時常變化。

未來的發行模式

很可能下一版VC++釋出時将會整合進WTL,是以,它可能會和ATL,STL,Data Templates一起自動安裝。

現在的安裝機制

目前,WTL是作為Microsoft Platform SDK (January 2000 或更高)的一部分釋出的,需要手動分三步安裝,未來可能會自動完成。

第一步-取得檔案

可以從MSDNCD光牒的第三張或http://msdn.microsoft.com得到安裝檔案。你可以選擇全部安裝這個SDK或僅僅安裝包含Windows Template Library的部分。(譯者注:你也以在www.farproc.com下載下傳WTL7.1安裝包)

注意:WTL7.1安裝的後面步驟與作者原文有出入,是以下面關于安裝的就沒有安裝原文翻譯

第二步-WTL Appwizard

安裝後打開WTL的安裝目錄(比如c:/Program Files/Microsoft Platform SDK)進入對應的AppWizXX目錄,其中XX為你的VC的版本号,比如你用的是VC6.0的話就進入AppWiz60,你會看到一個setup.js檔案,點選運作它就可以為你自動安裝WTL的AppWizard了。如果你無法運作這個檔案或想手工安裝,就複制這個目錄下的AtlApp60.awx到“……/Microsoft Visual Studio/Common/MSDev98/Template”目錄下也可以的。

然後打開vc,在new對話框中就可以看到“ATL/WTL AppWizard”選項了。

[翻譯]WTL開發者指南 第1章 WTL概述
[翻譯]WTL開發者指南 第1章 WTL概述

第三步-更新路徑

第三步是設定路徑以便讓編譯器找到WTL頭檔案。WTL是一個包含C++頭檔案(沒有.cpp檔案)的模闆庫,當編譯時,編譯器需要找到這些檔案,這些檔案在WTL安裝目錄/Src/WTL/include下,你可以在你的源檔案裡包含這個全路徑(不推薦,但也可以),或把這個路徑添加到VC的“Include Files”裡,如下圖

[翻譯]WTL開發者指南 第1章 WTL概述

WTL安裝了什麼

WTL安裝後,會有一個或若幹個AppWizXX目錄,這是WTL AppWizard檔案的所在地;一個Include目錄為WTL的頭檔案(也就是源檔案)所在;還有一個samples,一些WTL程式的例子。

資源

目前WTL的可用資源比較少,不過這種情況很可能在短期内改變。

開發工具

微軟的Platform SDK包含了WTL本身,除此之外,沒有其他的可用開發工具了。相信在不遠的将來,許多基于MFC的開發工具會轉向WTL的。

有趣的網址

一些Internet網址包含了一些有趣的WTL資料:

http://www.develop.com/dm/dev_resources.asp(非常全面)

http://www.idevresource.com/wtl

http://www.codeproject.com/wtl

http://www.argsoft.com/Wtl/DocView.html

http://www.sellsbrothers.com/tools/index.htm#wtl

新聞討論區和讨論清單

沒有專門針對的WTL程式設計新聞討論區和讨論清單,但是那些以ATL為内容的也通常會涉及WTL相關的内容。

最好的ATL讨論清單為:

http://discuss.microsoft.com/archives/atl.html

最好的ATL新聞租:

news://msnews.microsoft.com/microsoft.public.vc.atl

書籍

除了你正在閱讀的《WTL開發者指南》目前沒有其他的WTL書籍了。希望随着WTL的逐漸普及,更多的書商會提供WTL的書籍。

許多的ATL書籍所介紹的ATL windowing是WTL的重要基礎。最好的有:

¨          “Professional ATL COM Programming”, Dr. Richard Grimes, Wrox Press,

¨          1998, ISBN: 1-861001-40-1 (he also has a beginner’s guide and a reference

¨          manual published with Wrox)

¨          “ATL Internals”, Brent Rector and Chris Sells, Addison-Wesley, 1999, ISBN:

¨          0-201-69589-8

¨          “Creating Lightweight Components with ATL”, Jonathan Bates, SAMS, 1999,

¨          ISBN: 0-672-31535-1 [interesting discussion of adding support for Active

¨          Documents to ATL applications]

¨          “Inside ATL”, George Shepherd and Brad King, Microsoft Press, 1999, 1-

¨          57231-858-9

期刊

Visual C++開發者期刊(http://www.vcdj.com)在2000年4月發表過一篇WTL的文章。

所面向的讀者

本指南面向有經驗的,熟悉C++及C++模闆、ATL、Win32 windowing 和MFC UI程式設計的軟體開發人員。

章節内容

第2章-Win32 SDK windowing 回顧Win32 windowing的核心概念,在進入ATL和WTL程式設計之前必須對此有清晰的了解。

第3章-ATL windowing 介紹ATL在windowing方面的概念。包括建立視窗和對話框、處理消息、消息映射的處理及超類/子類。WTL中并沒有重寫這些概念,隻是把ATL中windowing方面的已有功能進行了擴充和擴充。

第4章-WTL快速之旅 對WTL程式設計進行了概述,引入了WTL建構過程(build process)、應用程式體系結構,還有一些其他東西,比如CRT的使用、WTL模闆和類、WTL的CString、宏的使用。

第5章-WTL Appwizard 分析不同的AppWizard選項生成的代碼。該章分析每個AppWizard選項以及不同的選項對生成的代碼的不同影響。

第6章-對話框和控件 看看在WTL中對話框和控件是如何工作的。講解标準、通用、ActiveX控件、通用對話框、屬性頁等的使用方法。該章還包括了message crackers的應用、DDX、資料驗證以及如何擴充它們。

第7章-圖形初步 如何輸出圖形。該章介紹了WTL中GDI對象的模闆類,比如CDC,CPen,CBrush,CFont,CBitmap,CPalette和CRgn。介紹在客戶區繪畫、繪畫、完全的視窗繪畫以及處理增強metafiles時所用到的CDC的派生類。

第8章-深入WTL 分析WTL的頭檔案,以這些模闆的設計方法。

第9章-臭蟲和建議 列舉WTL目前版本中的已知bug,提出一些擴充WTL功能的或大或小的建議。