中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > COM技术
一个字体按钮类(WTL)
作者:未知 时间:2005-07-20 14:21 出处:VC知识库 责编:chinaitpower
              摘要:一个字体按钮类(WTL)

一个字体按钮类(WTL)
作者:orange

下载本文示例源代码

本文打算介绍两个内容:一个是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));
(全文完)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有