65.9K
CodeProject is changing. Read more.
Home

WTL Window Font Class

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (6 votes)

Nov 7, 2002

1 min read

viewsIcon

167732

downloadIcon

1411

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;
    }
};