Click here to Skip to main content
Click here to Skip to main content

WTL Window Font Class

, 6 Nov 2002
Rate this:
Please Sign up or sign in to vote.
Use this class to add additional fonts to your WTL application
<!-- Download Links --> <!-- Article image -->

Sample Image - WTLWindowFont.jpg

<!-- Add the rest of your HTML here -->

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

Share

About the Author


Comments and Discussions

 
GeneralUsing with an MFC Dialog Application PinmemberAstronomer13-Jul-05 8:53 
GeneralRe: Using with an MFC Dialog Application PinmemberRobert Edward Caldecott14-Jul-05 5:31 
GeneralSmall issue with the CLogFont vtable PinmemberJason De Arte16-Oct-03 11:45 
GeneralRe: Small issue with the CLogFont vtable PinmemberRobert Edward Caldecott16-Oct-03 12:36 
General(Another) Minor change to Create() Pinmemberajh15-Oct-03 13:38 
GeneralMinor change to Create() PinsussAnonymous15-Oct-03 7:38 
GeneralRe: Minor change to Create() PinmemberRobert Edward Caldecott15-Oct-03 7:42 
Top tip! Thanks! Smile | :)
 

The Rob Blog
GeneralYou did it again! PinmemberMike Klimentiev30-Apr-03 8:12 
GeneralRe: You did it again! PinmemberRobert Edward Caldecott30-Apr-03 21:27 
GeneralLink error PinmemberDeXian15-Feb-03 1:36 
GeneralRe: Link error PinmemberRobert Edward Caldecott17-Feb-03 22:03 
GeneralRe: Link error Pinmemberelfric17-May-04 9:11 

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

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

| Advertise | Privacy | Mobile
Web04 | 2.8.141022.2 | Last Updated 7 Nov 2002
Article Copyright 2002 by Rob Caldecott
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid