用WTL構建HTML界面應用程序(1)

導讀:
  本文的主要讀者對象
  主要針對有一定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界面的應用程序,需要作如下選擇:
  wtlwiz7-01.gif
  
  首先是選擇WTL應用程序嚮導,然後
  wtlwiz7-02.gif
  
  選擇SDI應用程序,最後,
  wtlwiz7-03.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(資源定義),以及一組資源文件。
  現在程序已經可以運行了,其界面類似下圖:
  ui01.png
  
  其中,白色部分將出現Microsoft的主頁,如果連着網的話。
  接下來的部分中,我將拆開向導生成的這些源代碼,並介紹其執行過程。

本文轉自
http://www.frontfree.net/view/article_663.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章