一个字体按钮类(WTL)

  本文打算介绍两个内容:一个是WTL中非常好用的CDialogResize模板类,能让你拖动对话框改变大小(包括控件能自动适应对话框的改变);另一个是button按钮的子类化,产生一个有立体感的字体(本站上的一个例子是用MFC做的CMyTextButton类,我把它移植到WTL中,封装成CFontButton类,在这里先感谢提供此代码的作者),不过只能显示英文字体。通过这些例子,你可以看出WTL并没有什么神秘的地方。

  一. CDialogResize类的使用

  1.对话框继承的基类列中添加public CDialogResize<CDerive>

  本例中添加

 

public CDialogResize<CMainDlg>

 

2.添加宏

 

BEGIN_DLGRESIZE_MAP(CDialogResize<>)
       DLGRESIZE_CONTROL(id, flags)
END_DLGRESIZE_MAP()

 

  指定那个控件需要这种支持,其中id是控件ID,flags的值如下所示:

  DLSZ_SIZE_X = 0x00000001,

  DLSZ_SIZE_Y = 0x00000002,

  DLSZ_MOVE_X = 0x00000004,

  DLSZ_MOVE_Y = 0x00000008,

  DLSZ_REPAINT = 0x00000010.

  3.在OnInitDialog()中添加DlgResize_Init(),OK

  在atlframe.h中你可以找到DlgResize_Init()的定义,以前也有人用MFC写过类似的代码,有兴趣的话比较一下。

  最后别忘了在stdafx.h中添加相应的头文件,具体见源文件。

  二.CFontButton类的实现

  1.COwnerDraw和CCustomDraw

  这两个模板类都支持自画功能,他们两个的区别是CCustomDraw处理NM_CUSTOMDRAW,一般支持header,

  list view, rebar, toolbar, tooltip, trackbar 和 tree view 控件的重绘;COwnerDraw处理WM_DRAWITEM, WM_MEASUREITEM, WM_COMPAREITEM和 WM_DELETEITEM这四个消息,通常支持button, combo box, list box, list view control, 和 menu items

  的自绘。

  2. CCustomDraw 的消息映射

 

template <class T> class COwnerDraw
{
public:
    BEGIN_MSG_MAP(COwnerDraw<T>)
    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()
};

 

 有两种方法处理WM_DRAWITEM,你可以在控件的父窗口处理此消息,如下所示:

 

class CXXXDlg : public COwnerDraw, ...
{
  BEGIN_MSG_MAP(CSomeDlg)
    CHAIN_MSG_MAP(COwnerDraw<CXXXDlg>)
  END_MSG_MAP()
  void DrawItem ( LPDRAWITEMSTRUCT lpdis );
};

 

 另一种方法是让控件自己处理此消息,如下所示,本例中采用的就是此种方法

 

class CFontButtonImpl : public COwnerDraw<CFontButtonImpl>, ...
{
  BEGIN_MSG_MAP(CSomeButtonImpl)
    CHAIN_MSG_MAP_ALT(COwnerDraw<CFontButtonImpl>, 1)
    DEFAULT_REFLECTION_HANDLER()
  END_MSG_MAP()
  void DrawItem ( LPDRAWITEMSTRUCT lpdis );
};

 

 3. CControlWinTraits

 

typedef  CWinTraits<WS_CHILD | WS_VISIBLE |
  WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>  CControlWinTraits;

 

 想必大家一看就明白是什么意思。

  4. CFontButton类的使用

  在WTL工程中加入文件FontButton.h,然后添加变量

  

CFontButtonCtrl m_FontButton;

 

  在OnInitDialog( )中添加

m_FontButton.SubclassWindow(GetDlgItem(IDC_BUTTON_FONT1));

 

单击进入查看本文地址:【伊甸网】http://www.edenw.com/tech/devdeloper/vc/2010-01-23/761.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值