WTL实践经验总结(不断更新)
2009-12-29 16:52
585 查看
学习WTL快半年了,但是实际工作中根本用不到。一是因为公司不允许,二是有效的资源还比较少。通常情况下,自娱自乐的时候我还是选择WTL来做界面。在这里,我把平时学习实践过程中的东西(思想)保留下来,供大家参考,也可以互相进步。
这篇文章可能会很长很长,但是划分了4个模块:
一.WTL的使用
二.WTL的结构
三.WTL的剖析
四.WTL的资源
五.WTL的项目(我自己写的哦)
选择WTL很大部分原因都是因为对模板的迷恋,不知为啥,C++的魅力尽然在模板!好,开始我们的征程吧。
一 WTL的使用
1.安装:网上已经很多这样的文章了,看这里,这里
2.帮助插件:VisualFC、WTLHelper
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用来处理窗口消息的派发
看,一个switch结构就在_ProcessWindowMessage中就完成了。而其他的消息宏不过就是根据消息里WPARAM、LPARAM的不同意义封装不同的参数么?来看几个典型代表
是吧,没错!消息的Crack而已。
使用WTL::CString前定义_WTL_USER_CSTRING
使用SetMsgHandle(false)让消息流入基类
ATL的CWindow类只有一个数据成员,没有MFC窗口中的对象链.当一个CWindow类超出作用域时,它关联的窗口并不销毁掉。
ATL中的窗口过程是CWindowImpl.CDialogImpl实现普通对话框的窗口过程、CAxDialogImpl实现ActiveX对话框
三 WTL的剖析
四 WTL的资源
1.论坛: Yahoo
2.Article: Codeproject、Viksoe
五 WTL的项目
这篇文章可能会很长很长,但是划分了4个模块:
一.WTL的使用
二.WTL的结构
三.WTL的剖析
四.WTL的资源
五.WTL的项目(我自己写的哦)
选择WTL很大部分原因都是因为对模板的迷恋,不知为啥,C++的魅力尽然在模板!好,开始我们的征程吧。
一 WTL的使用
1.安装:网上已经很多这样的文章了,看这里,这里
2.帮助插件:VisualFC、WTLHelper
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: Codeproject、Viksoe
五 WTL的项目
相关文章推荐
- mysql学习经验与总结不断更新中
- 移动端网页开发经验总结 (不断更新ing)
- 通过tipask平台学习php的经验总结,不断更新中。
- C++:Debug经验总结(不断更新)
- MFC中的经验小技巧总结(不断更新中~~~~)
- 开发小经验总结(不断更新)
- 经验总结:【不断更新】
- git 使用经验与技巧总结 (不断更新中)
- ios开发总结,日常开发:ios开发功能收集,经验分享等等(不断更新中。。。)
- Java面试题总结(后续不断更新...)
- ios 技巧总结(不断更新)
- 总结(不断更新)
- struts2 错误总结 自己会不断更新中。。。。。
- java零碎知识总结(不断更新中)
- linux命令总结(不断更新)
- Android_知识点总结(不断更新中...)
- CloudStack运维经验(不断更新)
- 关于Javascript与表单结合时出现"对象不支持此属性或方法"的问题总结(不断更新中...)
- C Language 面试题汇总 (答案仅供参考_不断总结更新)
- Nginx经验总结(持续更新)