WTL Window Font Class






4.11/5 (6 votes)
Nov 7, 2002
1 min read

167732

1411
Use this class to add additional fonts to your WTL application
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; } };