您的位置:首页 > 其它

WTL实践经验总结(不断更新)

2009-12-29 16:52 585 查看
学习WTL快半年了,但是实际工作中根本用不到。一是因为公司不允许,二是有效的资源还比较少。通常情况下,自娱自乐的时候我还是选择WTL来做界面。在这里,我把平时学习实践过程中的东西(思想)保留下来,供大家参考,也可以互相进步。
这篇文章可能会很长很长,但是划分了4个模块:
一.WTL的使用
二.WTL的结构
三.WTL的剖析
四.WTL的资源
五.WTL的项目(我自己写的哦)
选择WTL很大部分原因都是因为对模板的迷恋,不知为啥,C++的魅力尽然在模板!好,开始我们的征程吧。
 
一 WTL的使用
1.安装:网上已经很多这样的文章了,看这里这里
2.帮助插件:VisualFCWTLHelper
3.教程:
 
 
二 WTL的结构
WTL的类大致分为:
1.框架窗口:CFrameWindowImpl、CMDIFrameWindowImpl
2.控件封装: CButtonT、CListViewCtrl
3.GDI封装: CDCT、CMenuT
4.特殊界面封装:CSplitterWindow、CUpdateUI、CCustomDraw
5.实用工具类:CString、CRect
6.宏:BEGIN_MSG_MAP、END_MSG_MAP
 
先来看看令人头疼的“宏”介绍吧:
1.在atlcrack.h中,BEGIN_MSG_MAP_EX和END_MSG_MAP_EX用来处理窗口消息的派发
1: // Note about message maps with cracked handlers:


2: // For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX.


3: // For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes,


4: // but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl.


5: 


6: #define BEGIN_MSG_MAP_EX(theClass) /


7: public: /


8:     /* 在UI类中,声明一个m_bMsgHandled的变量,来判断消息是否已处理,是否需要传给基类*/ /


9:     BOOL m_bMsgHandled; /


10:     /* "handled" management for cracked handlers */ /


11:     BOOL IsMsgHandled() const /


12:     { /


13:         return m_bMsgHandled; /


14:     } /


15:     void SetMsgHandled(BOOL bHandled) /


16:     { /


17:         m_bMsgHandled = bHandled; /


18:     } /


19:     BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) /


20:     { /


21:         BOOL bOldMsgHandled = m_bMsgHandled; /


22:         BOOL bRet = _ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, dwMsgMapID); /


23:         m_bMsgHandled = bOldMsgHandled; /


24:         return bRet; /


25:     } /


26:     /* 带下划线开头的函数,都是本类才调用的函数,一般做法为声明在private区域中*/ /


27:     BOOL _ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID) /


28:     { /


29:         BOOL bHandled = TRUE; /


30:         hWnd; /


31:         uMsg; /


32:         wParam; /


33:         lParam; /


34:         lResult; /


35:         bHandled; /


36:         switch(dwMsgMapID) /


37:         { /


38:         case 0:


39: 


40: 



1: #define END_MSG_MAP() /


2:             break; /


3:         default: /


4:             ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)/n"), dwMsgMapID); /


5:             ATLASSERT(FALSE); /


6:             break; /


7:         } /


8:         return FALSE; /


9:     }


10: 


11: #define END_MSG_MAP_EX END_MSG_MAP


看,一个switch结构就在_ProcessWindowMessage中就完成了。而其他的消息宏不过就是根据消息里WPARAM、LPARAM的不同意义封装不同的参数么?来看几个典型代表


1: ///////////////////////////////////////////////////////////////////////////////


2: // Standard Windows message macros


3: 


4: // int OnCreate(LPCREATESTRUCT lpCreateStruct)


5: #define MSG_WM_CREATE(func) /


6:     if (uMsg == WM_CREATE) /


7:     { /


8:         SetMsgHandled(TRUE); /


9:         lResult = (LRESULT)func((LPCREATESTRUCT)lParam); /


10:         if(IsMsgHandled()) /


11:             return TRUE; /


12:     }


13: 


14: // BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)


15: #define MSG_WM_INITDIALOG(func) /


16:     if (uMsg == WM_INITDIALOG) /


17:     { /


18:         SetMsgHandled(TRUE); /


19:         lResult = (LRESULT)func((HWND)wParam, lParam); /


20:         if(IsMsgHandled()) /


21:             return TRUE; /


22:     }


是吧,没错!消息的Crack而已。

 

 

使用WTL::CString前定义_WTL_USER_CSTRING

使用SetMsgHandle(false)让消息流入基类

 

ATL的CWindow类只有一个数据成员,没有MFC窗口中的对象链.当一个CWindow类超出作用域时,它关联的窗口并不销毁掉。

ATL中的窗口过程是CWindowImpl.CDialogImpl实现普通对话框的窗口过程、CAxDialogImpl实现ActiveX对话框

 

 

三 WTL的剖析

 

 

四 WTL的资源

1.论坛: Yahoo 

2.Article: CodeprojectViksoe

 

五 WTL的项目
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: