Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1993279
  • 博文数量: 950
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 13070
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-04 09:23
文章分类

全部博文(950)

文章存档

2011年(1)

2008年(949)

我的朋友

分类: C/C++

2008-08-04 09:31:05

下载本文示例代码
下载本文示例源代码

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

一. CDialogResize类的使用


1.对话框继承的基类列中添加public CDialogResize
本例中添加

public CDialogResize 
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 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()

};
有两种方法处理WM_DRAWITEM,你可以在控件的父窗口处理此消息,如下所示:
class CXXXDlg : public COwnerDraw, ...

{

	BEGIN_MSG_MAP(CSomeDlg)

		CHAIN_MSG_MAP(COwnerDraw)

	END_MSG_MAP()

 

	void DrawItem ( LPDRAWITEMSTRUCT lpdis );

};
另一种方法是让控件自己处理此消息,如下所示,本例中采用的就是此种方法
class CFontButtonImpl : public COwnerDraw, ...

{

	BEGIN_MSG_MAP(CSomeButtonImpl)

		CHAIN_MSG_MAP_ALT(COwnerDraw, 1)

		DEFAULT_REFLECTION_HANDLER()

	END_MSG_MAP()

 

	void DrawItem ( LPDRAWITEMSTRUCT lpdis );

};
3. CControlWinTraits
typedef   CWinTraits   CControlWinTraits;
想必大家一看就明白是什么意思。

4. CFontButton类的使用

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

CFontButtonCtrl  m_FontButton;
在OnInitDialog( )中添加
m_FontButton.SubclassWindow(GetDlgItem(IDC_BUTTON_FONT1));
(全文完) 下载本文示例代码
阅读(418) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~