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

WTL字體類

編輯:關於VC++

前言

使用這個類可以很容易在窗口或對話框中加入各種額外的字體。我們可以通過CWindowFont類建立一個基於當前窗口的新字體。你所要做的就是設置字體屬性(加重、斜體等),來美化你的程序。例如,在程序中一個使用加重字體的靜態控件。

在WTL對話框中使用該類,只需簡單地進行如下操作。首先加入頭文件:

#include "windowfont.h"

然後,為每一個待創建的字體加入一個CWindowsFont成員變量。

...
CWindowFont m_fontBold;

然後,在對話框中的OnInitDialog函數中, 直接在對話框中的控件上應用新字體風格。

// 建立字體,應用在靜態控件 IDC_TEXT 上
m_fontBold.Apply(m_hWnd, CWindowFont::typeBold, IDC_TEXT);

調用Create函數創建字體,調用控件的SetFont函數。

//建立加重字體
if (m_fontBold.Create(m_hWnd, CWindowFont::typeBold))
  GetDlgItem(IDC_TEXT).SetFont(m_fontBold);

非常簡單!通常,我在每個程序的關於框內使用這個類去顯示程序的版本信息。如圖一所示。另外我還常在向導首頁上使用該類來建立兩倍高度的字體,以美化窗口外觀。

圖一

說明

類中字體可以設置為以下風格 ,也可以對它們進行或操作:

加重Bold (CWindowFont::typeBold)
   斜體Italic (CWindowFont::typeItalic)
   下劃線 (CWindowFont::typeUnderline)
   兩倍高度 (CWindowFont::typeDoubleHeight)

CWindowFont部分源碼

CWindowFont類的部分源碼如下所示:

#pragma once
#include
// LOGFONT 結構的包裹類
class CLogFont : public LOGFONt
{
public:
  CLogFont()
  {
    memset(this, 0, sizeof(LOGFONT));
  }
};
// 建立基於指定窗口的字體
class CWindowFont : public CFont
{
public:
  //字體風格
  typedef enum tagEType
  {
    typeNormal    = 0x00,
    typeBold     = 0x01,
    typeItalic    = 0x02,
    typeUnderline  = 0x04,
    typeDoubleHeight = 0x08,
  } EType;
public:
  CWindowFont() : CFont()
  {
  }

  /// hWnd -窗口句柄
  /// nType - 字體風格
  CWindowFont(HWND hWnd, int nType)
  {
    // HWND不能為NULL
    ATLASSERT(hWnd != NULL);
    //創建字體
    Create(hWnd, nType);
  }

  virtual ~CWindowFont()
  {
  }
public:
  //創建字體
  // hWnd -窗口句柄
  // nType -字體風格
  //成功則返回TRUE
  bool Create(HWND hWnd, int nType)
  {
    // 窗口句柄不能為NULL
    ATLASSERT(hWnd != NULL);
    ATLASSERT(::IsWindow(hWnd) != FALSE);
    // 獲得當前窗口的字體
    HFONT hFont = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0);
    // 是否獲得當前字體成功?
    if (hFont == NULL)
      return false;

    CLogFont lf;
    // 填充 LOGFONT結構
    if (::GetObject(hFont, sizeof(lf), &lf) == 0)
      return false;
    // 分離LOGFONT成員變量
    if (nType & typeBold)
      lf.lfWeight = FW_BOLD;
    if (nType & typeItalic)
      lf.lfItalic = TRUE;
    if (nType & typeUnderline)
      lf.lfUnderline = TRUE;
    if (nType & typeDoubleHeight)
      lf.lfHeight *= 2;

    // 建立新字體
    return CreateFontIndirect(&lf) ? true : false;
  }

  //建立新字體並應用到控件上去
  bool Apply(HWND hWnd, int nType, UINT nControlID)
  {
    // 先建立字體
    if (!Create(hWnd, nType))
      return false;
    // 應用到控件上
    CWindow wndControl = ::GetDlgItem(hWnd, nControlID);
    ATLASSERT(wndControl != NULL);
    wndControl.SetFont(m_hFont);
    return true;
  }
};

本文配套源碼

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