最近尝试了解WTL在UI上的应用,实属彻彻底底的初学者,所以只是在此写上一些纯属个人认识。
(若是能抛个砖头引玉最好!)
一、WTL的安装
WTL的最新版本8.1,但WTL8.1不支持在VC6上直接安装,建议你安装WTL7.0版本。也有称可手动安装,我也在网上搜索到了些方法,但是没有去尝试(我不敢保证之后会不会出现让VC大惊小怪的问题,若你对其感兴趣,我只能保证一定能搜索的到方法)。
其实关于WTL的安装本无可说,只是或许如我一样的初学者会有一些疑惑。因为WTL中setupXX.js安装文件只是为你的VC安装了WTL的AppWiz,安装后VC的New->Project中会添加选项ATL/WTL AppWizard,但并没有自动将WTL工程所需的atl类.h文件(这些文件都在WTL安装文件的Include目录中)导入到你的VC安装路径中。若你和我一开始一样,以为双击了安装文件就可以将安装包删除了,那么你就和我一般犯了个低级错误。建议的安装方法是:1.首先在你的VC安装目录下新建目录WTL(可以是其他自定任意合法目录名称),然后将安装包(自解压文件)解压到此目录中,双击目录AppWiz\setupXX.js安装;2.打开VC6.0,Tools->Options->Directory->Include files中将WTL中的include目录路径添加进去。如果你用的是VS2008,选择Tools->Options->Project and solutions->VC++ Directories->Include files。
二、WTL初识
WTL是构建与ATL之上的一系列附加类,你会发现WTL安装目录中的include中都是以atl开头命名的一些.h文件,在学习WTL之前,有必要对ATL_style C++模板类有所理解,VC知识库(http://www.vckbase.com/document/viewdoc/?id=1319)中对此有较细的分析。
了解了ATL-style模板类,接下来就开始介绍WTL了。
WTL的类大致可以分为几种类型:
1.主框架窗口的实现
2.控件的封装- CButton, CListViewCtrl
3.GDI 对象的封装- CDC, CMenu
4.一些特殊的界面特性 - CSplitterWindow, CUpdateUI, CDialogResize, CCustomDraw
5.实用的工具类和宏- CString, CRect, BEGIN_MSG_MAP_EX
今天介绍下WTL的窗口类,任何非对话框窗口都是从CWindowImpl 派生的,对话框窗口派生自CDialogImpl或CAxDialogImpl,CDialogImpl 用于实现普通的对话框而CAxDialogImpl实现含有ActiveX控件的对话框。通常,利用WTL的AppWizard新建一个WTL工程,WTL AppWizard会自动将我们窗口类从这些基类派生,所以重点说下如何对WTL的窗口添加消息响应。
WTL通过在自己的派生类中利用宏BEGIN_MSG_MAP和END_MSG_MAP维持一个类似MFC的消息映射链:
class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
BEGIN_MSG_MAP(CMyWindow)
END_MSG_MAP()
// ...
};
在BEGIN_MSG_MAP和END_MSG_MAP之中添加需要处理的消息的映射,然后声明消息处理函数、实现消息处理函数。
在此,添加一个WM_ERASEBKGND消息的响应,在OnEraseBKgnd()中我们在窗口中显示字符串"WTL APP":
// MyWindow.h
class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
BEGIN_MSG_MAP(CMyWindow)
MSG_WM_ERASEBKGND(OnEraseBkgnd)
END_MSG_MAP()
LRESULT OnEraseBkgnd ( HDC hdc );
};
// MyWindow.cpp
LRESULT OnEraseBkgnd ( HDC hdc )
{
CDCHandle dc(hdc);
CRect rc;
GetClientRect ( rc );
dc.SaveDC();
dc.SetTextColor ( RGB(0,0,0) );
dc.ExtTextOut ( 0, 0, ETO_OPAQUE, rc, "My First WTL Window", strlen("My First WTL Window"), NULL );
dc.RestoreDC(-1);
return 1;
}
好,今天就写这些了。明天继续学习。。。
(若是能抛个砖头引玉最好!)
一、WTL的安装
WTL的最新版本8.1,但WTL8.1不支持在VC6上直接安装,建议你安装WTL7.0版本。也有称可手动安装,我也在网上搜索到了些方法,但是没有去尝试(我不敢保证之后会不会出现让VC大惊小怪的问题,若你对其感兴趣,我只能保证一定能搜索的到方法)。
其实关于WTL的安装本无可说,只是或许如我一样的初学者会有一些疑惑。因为WTL中setupXX.js安装文件只是为你的VC安装了WTL的AppWiz,安装后VC的New->Project中会添加选项ATL/WTL AppWizard,但并没有自动将WTL工程所需的atl类.h文件(这些文件都在WTL安装文件的Include目录中)导入到你的VC安装路径中。若你和我一开始一样,以为双击了安装文件就可以将安装包删除了,那么你就和我一般犯了个低级错误。建议的安装方法是:1.首先在你的VC安装目录下新建目录WTL(可以是其他自定任意合法目录名称),然后将安装包(自解压文件)解压到此目录中,双击目录AppWiz\setupXX.js安装;2.打开VC6.0,Tools->Options->Directory->Include files中将WTL中的include目录路径添加进去。如果你用的是VS2008,选择Tools->Options->Project and solutions->VC++ Directories->Include files。
二、WTL初识
WTL是构建与ATL之上的一系列附加类,你会发现WTL安装目录中的include中都是以atl开头命名的一些.h文件,在学习WTL之前,有必要对ATL_style C++模板类有所理解,VC知识库(http://www.vckbase.com/document/viewdoc/?id=1319)中对此有较细的分析。
了解了ATL-style模板类,接下来就开始介绍WTL了。
WTL的类大致可以分为几种类型:
1.主框架窗口的实现
-
CFrameWindowImpl, CMDIFrameWindowImpl 2.控件的封装- CButton, CListViewCtrl
3.GDI 对象的封装- CDC, CMenu
4.一些特殊的界面特性 - CSplitterWindow, CUpdateUI, CDialogResize, CCustomDraw
5.实用的工具类和宏- CString, CRect, BEGIN_MSG_MAP_EX
今天介绍下WTL的窗口类,任何非对话框窗口都是从CWindowImpl 派生的,对话框窗口派生自CDialogImpl或CAxDialogImpl,CDialogImpl 用于实现普通的对话框而CAxDialogImpl实现含有ActiveX控件的对话框。通常,利用WTL的AppWizard新建一个WTL工程,WTL AppWizard会自动将我们窗口类从这些基类派生,所以重点说下如何对WTL的窗口添加消息响应。
WTL通过在自己的派生类中利用宏BEGIN_MSG_MAP和END_MSG_MAP维持一个类似MFC的消息映射链:
class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
BEGIN_MSG_MAP(CMyWindow)
END_MSG_MAP()
// ...
};
在BEGIN_MSG_MAP和END_MSG_MAP之中添加需要处理的消息的映射,然后声明消息处理函数、实现消息处理函数。
在此,添加一个WM_ERASEBKGND消息的响应,在OnEraseBKgnd()中我们在窗口中显示字符串"WTL APP":
// MyWindow.h
class CMyWindow : public CFrameWindowImpl<CMyWindow>
{
public:
BEGIN_MSG_MAP(CMyWindow)
MSG_WM_ERASEBKGND(OnEraseBkgnd)
END_MSG_MAP()
LRESULT OnEraseBkgnd ( HDC hdc );
};
// MyWindow.cpp
LRESULT OnEraseBkgnd ( HDC hdc )
{
CDCHandle dc(hdc);
CRect rc;
GetClientRect ( rc );
dc.SaveDC();
dc.SetTextColor ( RGB(0,0,0) );
dc.ExtTextOut ( 0, 0, ETO_OPAQUE, rc, "My First WTL Window", strlen("My First WTL Window"), NULL );
dc.RestoreDC(-1);
return 1;
}
好,今天就写这些了。明天继续学习。。。
来源:https://www.cnblogs.com/vsense/archive/2009/07/23/1529736.html