Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2023805
  • 博文数量: 960
  • 博客积分: 52560
  • 博客等级: 大将
  • 技术积分: 13131
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-31 14:15
文章分类

全部博文(960)

文章存档

2011年(1)

2008年(959)

我的朋友

分类: C/C++

2008-08-01 16:58:29

下载本文示例代码
来源:

下载源代码


前言
使用这个类可以很容易在窗口或对话框中加入各种额外的字体。我们可以通过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;

    }

};    
下载本文示例代码
阅读(297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~