分类: C/C++
2008-03-18 17:18:32
本文打算介绍两个内容:一个是WTL中非常好用的CDialogResize模板类,能让你拖动对话框改变大小(包括控件能自动适应对话框的改变);另一个是button按钮的子类化,产生一个有立体感的字体(本站上的一个例子是用MFC做的CMyTextButton类,我把它移植到WTL中,封装成CFontButton类,在这里先感谢提供此代码的作者),不过只能显示英文字体。通过这些例子,你可以看出WTL并没有什么神秘的地方。
一. CDialogResize类的使用
1.对话框继承的基类列中添加public CDialogResize
本例中添加
public CDialogResize2.添加宏
BEGIN_DLGRESIZE_MAP(CDialogResize<>) DLGRESIZE_CONTROL(id, flags) END_DLGRESIZE_MAP()指定那个控件需要这种支持,其中id是控件ID,flags的值如下所示:
template有两种方法处理WM_DRAWITEM,你可以在控件的父窗口处理此消息,如下所示:class COwnerDraw { public: BEGIN_MSG_MAP(COwnerDraw ) MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem) MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem) MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem) MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem) ALT_MSG_MAP(1) MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem) MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem) MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem) MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem) END_MSG_MAP() };
class CXXXDlg : public COwnerDraw另一种方法是让控件自己处理此消息,如下所示,本例中采用的就是此种方法, ... { BEGIN_MSG_MAP(CSomeDlg) CHAIN_MSG_MAP(COwnerDraw ) END_MSG_MAP() void DrawItem ( LPDRAWITEMSTRUCT lpdis ); };
class CFontButtonImpl : public COwnerDraw3. CControlWinTraits, ... { BEGIN_MSG_MAP(CSomeButtonImpl) CHAIN_MSG_MAP_ALT(COwnerDraw , 1) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() void DrawItem ( LPDRAWITEMSTRUCT lpdis ); };
typedef CWinTraits想必大家一看就明白是什么意思。CControlWinTraits;
4. CFontButton类的使用
在WTL工程中加入文件FontButton.h,然后添加变量
CFontButtonCtrl m_FontButton;在OnInitDialog( )中添加
m_FontButton.SubclassWindow(GetDlgItem(IDC_BUTTON_FONT1));(全文完)