Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

WTL Window Font Class

0.00/5 (No votes)
6 Nov 2002 1  
Use this class to add additional fonts to your WTL application

Sample Image - WTLWindowFont.jpg

Introduction

Use this class to easily add additional fonts to your WTL windows/dialogs. The class, CWindowFont, will create a new font based on the font used by an existing window. All you supply are the necessary font attributes (bold, italic, etc.), perfect for use with a dialog based application where you want to display, for example, a static control using a bold font.

How to use

To use this class in a WTL dialog application, simply do the following:

First include the header file:

#include "windowfont.h"

Next, add a suitable CWindowFont member for each font you wish to create, e.g.:

...
CWindowFont m_fontBold;

Next, in your dialogs OnInitDialog function, create the font and apply it to a dialog control:

// Create the font and apply to the IDC_TEXT control

m_fontBold.Apply(m_hWnd, CWindowFont::typeBold, IDC_TEXT);

Alternatively, call the Create function and apply the font "by hand":

// Create a bold font

if (m_fontBold.Create(m_hWnd, CWindowFont::typeBold))
    GetDlgItem(IDC_TEXT).SetFont(m_fontBold);

That's it! Simple. For example, I use this class in every "About" box I have (to display the program version info, etc, in bold). I have also used this class to create a double-height font for use on the first page of a wizard, etc.

Notes

The following font styles are available (note that you can OR these together in any combination):

  • Bold (CWindowFont::typeBold)
  • Italic (CWindowFont::typeItalic)
  • Underline (CWindowFont::typeUnderline)
  • Double-height (CWindowFont::typeDoubleHeight)

Note also that the dialogs used in the demo are all set to use the "MS Shell Dlg" font - which is best if you want to create a double-height font (as it will render better than the default "MS Sans Serif" font).

CWindowFont Source

The CWindowFont class is small enough to post here:

#pragma once

#include 


// Wrapper for the Win32 LOGFONT structure

class CLogFont : public LOGFONT
{
public:
    CLogFont()
    {
        memset(this, 0, sizeof(LOGFONT));        
    }
};

// Class used to create a font based on the font used by a specific window

class CWindowFont : public CFont  
{
public:
    // Font styles

    typedef enum tagEType
    {
        typeNormal       = 0x00,
        typeBold         = 0x01,
        typeItalic       = 0x02,
        typeUnderline    = 0x04,
        typeDoubleHeight = 0x08,
    } EType;
public:
    CWindowFont() : CFont()
    {
    }
    
    /// hWnd  - The window to use for the base font

    /// nType - Font style flags

    CWindowFont(HWND hWnd, int nType)
    {
        // We need a HWND

        ATLASSERT(hWnd != NULL);
        // Create the font

        Create(hWnd, nType);
    }
    
    virtual ~CWindowFont()
    {
    }
public:
    // Create the font

    // hWnd  - The window to use for the base font

    // nType - Font style flags

    // return true on success

    bool Create(HWND hWnd, int nType)
    {
        // Be defensive

        ATLASSERT(hWnd != NULL);
        ATLASSERT(::IsWindow(hWnd) != FALSE);
        // Get the font the window is currently using

        HFONT hFont = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0);
        // Do we have a font?

        if (hFont == NULL)
            return false;
        
        CLogFont lf;        
        // Fill the LOGFONT

        if (::GetObject(hFont, sizeof(lf), &lf) == 0)
            return false;
        // Amend the LOGFONT members

        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;
        
        // Create the new font

        return CreateFontIndirect(&lf) ? true : false;
    }
    
    // Create the font and apply to a nominate dialog control

    bool Apply(HWND hWnd, int nType, UINT nControlID)
    {
        // First create the font

        if (!Create(hWnd, nType))
            return false;
        // Apply to the nominated control

        CWindow wndControl = ::GetDlgItem(hWnd, nControlID);
        ATLASSERT(wndControl != NULL);
        // Apply

        wndControl.SetFont(m_hFont);
        return true;
    }
};

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here