1 
2 // ------------------------------------------------------------------
3 // Windows 2000 Graphics API Black Book
4 // Chapter 4 - Utility functions
5 //
6 // Created by Damon Chandler <dmc27@ee.cornell.edu>
7 // Updates can be downloaded at: <www.coriolis.com>
8 //
9 // Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
10 // if you have any questions about this code.
11 // ------------------------------------------------------------------
12 
13 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
14 #include <windows.h>
15 #include <cassert>
16 
17 #include "mk_font.h"
18 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
19 
20 namespace font {
21 
22 // creates a logical font
23 HFONT MakeFont(
24     IN HDC hDestDC,           // handle to target DC
25     IN LPCSTR typeface_name,  // font's typeface name
26     IN int point_size,        // font's point size
27     IN const BYTE charset,    // font's character set
28     IN const DWORD style      // font's styles
29    )
30 {
31    //
32    // NOTE: On Windows 9x/Me, GetWorldTransform is not
33    // supported.  For compatibility with these platforms you
34    // should initialize the XFORM::eM22 data member to 1.0.
35    //
36    XFORM xf = {0, 0, 0, 1.0, 0, 0};
37    GetWorldTransform(hDestDC, &xf);
38    int pixels_per_inch = GetDeviceCaps(hDestDC, LOGPIXELSY);
39 
40    POINT PSize = {
41       0,
42       -MulDiv(static_cast<int>(xf.eM22 * point_size + 0.5),
43               pixels_per_inch, 72)
44       };
45 
46    HFONT hResult = NULL;
47    if (DPtoLP(hDestDC, &PSize, 1))
48    {
49       LOGFONT lf;
50       memset(&lf, 0, sizeof(LOGFONT));
51 
52       lf.lfHeight = PSize.y;
53       lf.lfCharSet = charset;
54       lstrcpyn(reinterpret_cast<LPTSTR>(&lf.lfFaceName),
55                typeface_name, LF_FACESIZE);
56 
57       lf.lfWeight = (style & FS_BOLD) ? FW_BOLD : FW_DONTCARE;
58       lf.lfItalic = (style & FS_ITALIC) ? true : false;
59       lf.lfUnderline = (style & FS_UNDERLINE) ? true : false;
60       lf.lfStrikeOut = (style & FS_STRIKEOUT) ? true : false;
61 
62       // create the logical font
63       hResult = CreateFontIndirect(&lf);
64    }
65    return hResult;
66 }
67 //-------------------------------------------------------------------------
68 
69 } // namespace font
70