Click here to Skip to main content
15,881,089 members
Articles / Desktop Programming / WTL
Article

WTL Window Font Class

Rate me:
Please Sign up or sign in to vote.
4.11/5 (6 votes)
6 Nov 20021 min read 166.3K   1.4K   19   13
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 <ATLGDI.H>

// 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



Comments and Discussions

 
QuestionLicense for this article Pin
Ori Saporta29-Apr-15 1:00
Ori Saporta29-Apr-15 1:00 
GeneralUsing with an MFC Dialog Application Pin
Astronomer13-Jul-05 8:53
Astronomer13-Jul-05 8:53 
GeneralRe: Using with an MFC Dialog Application Pin
Rob Caldecott14-Jul-05 5:31
Rob Caldecott14-Jul-05 5:31 
GeneralSmall issue with the CLogFont vtable Pin
Jason De Arte16-Oct-03 11:45
Jason De Arte16-Oct-03 11:45 
GeneralRe: Small issue with the CLogFont vtable Pin
Rob Caldecott16-Oct-03 12:36
Rob Caldecott16-Oct-03 12:36 
General(Another) Minor change to Create() Pin
ajhuddy15-Oct-03 13:38
ajhuddy15-Oct-03 13:38 
GeneralMinor change to Create() Pin
Anonymous15-Oct-03 7:38
Anonymous15-Oct-03 7:38 
GeneralRe: Minor change to Create() Pin
Rob Caldecott15-Oct-03 7:42
Rob Caldecott15-Oct-03 7:42 
GeneralYou did it again! Pin
Mike Klimentiev30-Apr-03 8:12
Mike Klimentiev30-Apr-03 8:12 
GeneralRe: You did it again! Pin
Rob Caldecott30-Apr-03 21:27
Rob Caldecott30-Apr-03 21:27 
Thankyou Mike! Much appreciated Blush | :O . I will eventually get around to posting some more WTL articles...


Go and tell the king that the sky is falling in. But it's not. Maybe not.
Radiohead, 2+2=5 (Hail To The Thief)

GeneralLink error Pin
DeXian15-Feb-03 1:36
DeXian15-Feb-03 1:36 
GeneralRe: Link error Pin
Rob Caldecott17-Feb-03 22:03
Rob Caldecott17-Feb-03 22:03 
GeneralRe: Link error Pin
elfric17-May-04 9:11
elfric17-May-04 9:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.