程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 一個字體按鈕類(WTL)

一個字體按鈕類(WTL)

編輯:關於VC++

本文打算介紹兩個內容:一個是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));

(全文完)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved