WTL 是 Template Library,所以安裝的方法就是解開後,把 WTL\include 加到 project 的 include path 里就可以。
Tools--Options--ProjectAndSolutions--VC++Directory
這個option 每個 platform (Win32, Ce, SmartPhone..) 都不樣,所以要一一設定。
AppWiz 是安裝 WTL AppWizard 的javascript,根據 VS的不同,有不同的 script
- setup80x.js 是 for VS2005 express 版本,但是 express 版不包含 ATL,所以要而外安裝一版 platform SDK 。
- 也有提供 WinCE版本的 wizard install script
Wizard 執行完後,New Project,選 WTL, Dialog base ,就可以create 一個 dialog program。
就先由 Sample 的:ImageView 作練習,sample 是 for smart phone,照著 copy 到 standard sdk
看 起來好像是 SDI application。所以用 Wizard create 一個 SDI..
一開始就遇到一個問題....CString 宣告不認識 -- 結果好像是 WTL8 有改了,要 include atlmisc.h。
感覺起來就是利用 template ,做到針對 function implement class/template。
使用時依照需要繼承 class/template,然後改寫某 function。
這就跟 RBT 的 coding 構想一樣:找class繼承,然後修改
這樣的設計理念應該是每個 class/template 只做一件事。使用的方法就是繼承,修改,然後生成。
另一種理念應該是...萬能的 class,使用發法是生成(給予適當參數),然後使用。
所以 WTL 的程式設計好像是...了解MFC 原來 一些 event hander -- OnCreate, OnPaint, OnClick,,,, 在 WTL 中處理的 template/class,依照需要的時候繼承下來,然後就可以改寫 那些event handler。
唉~~對於 FrameWindow 跟 Window 的區別還是不了解..
在 atlcrack.h 的 BEGIN_MSG_MAP_EX 註解:
// Note about message maps with cracked handlers:
// For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX.
// For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes,
// but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl.
所以繼承 CWindowImpl和 CDialogImpl的話,就可以用 BEGIN_MSG_MAP,如果不是繼承這兩個,就要用 BEGIN_MSG_MAP_EX (?)
CWindowImpl和CDialogImpl 定義在 ATL。
- CWindow (也定義在ATL),只包含 HWND這個資料結構的內容,還有一些標準 WIN32 function 。並沒有做出 message loop,message handler 這樣的架構出來。
- CWindowImpl 就有 implement message loop/handler 的架構。
所以
- 繼承 CWindow 的話,要自己作 message loop/handler -- WTL 提供 BEGIN_MSG_MAP_EX 這類 macro。
- 繼承 CWindowImpl 的話,已經有 message loop 了,就用 BEGIN_MSG_MAP 就可以。
ATL 有關 Windows 部份可以參考
MSDNhttp://wtl.wikispaces.com/ 這個有比較好的wiki說明。