第17章 文本和字体_17.4 字体枚举

17.4 字体枚举

17.4.1 枚举函数

(1)EnumFontFamiliesEx函数


参数


含义


HDC hdc


handle to DC


LPLOGFONT lpLogfont


传入LOGFONT结构的指针

注意:如果lfCharset=DEFAULT_CHARSET;

lf.lfFaceName[0]=NULL,则枚举所有字体


FONTENUMPROC lpEnumFontFamExProc


枚举回调函数


LPARAM lParam


可以指定附加数据,会传到枚举的回调函数中


DWORD dwFlags


没用,必须为0

(2)EnumFontFamExProc回调函数(在每找到一种字体,该函数就被调用一次)


参数


含义


ENUMLOGFONTEX *lpelfe


指向含有字体的逻辑属性的ENUMLOGFONTEX结构的指针


NEWTEXTMETRICEX *lpntme


指向含有字体物理属性的结构的指针


DWORD FontType


指定字体类型,此参数可为下列值的组合。

DEVICE_FONTTYPE, RASTER_FONTTYPE, TRUETYPE_FONTTYPE


LPARAM lParam


由EnumFontFamiliesEx中lParam指定的数据

【EnumFont程序】枚举计算机上的所有字体

/*------------------------------------------------------------
ENUMFONT.C -- EnumFontFamiliesEx函数
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
#define ID_LIST 1
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX*, NEWTEXTMETRICEX*, DWORD, LPARAM);
int DisplayFonts(HWND hwnd, HDC hdc);
typedef struct
{
    HWND hwndList;
    int iCount;
} EnumData;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("EnumFont");
    HWND         hwnd;
    MSG          msg;
    WNDCLASSEX     wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(hInstance, szAppName);
    wndclass.hIconSm = LoadIcon(hInstance, szAppName);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    if (!RegisterClassEx(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
                   szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,                  // window class name
                        TEXT("利用EnumFontFamiliesEx枚举字体"), // window caption
                        WS_OVERLAPPEDWINDOW,        // window style
                        CW_USEDEFAULT,              // initial x position
                        CW_USEDEFAULT,              // initial y position
                        560,              // initial x size
                        480,              // initial y size
                        NULL,                       // parent window handle
                        NULL,                       // window menu handle
                        hInstance,                  // program instance handle
                        NULL);                     // creation parameters

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC         hdc;
    PAINTSTRUCT ps;
    static int cxChar, cyChar;
    static TEXTMETRIC tm;
    static HWND hwndList;
    static int iCount;
    TCHAR szBuffer[50];
    switch (message)
    {
    case WM_CREATE:
        cxChar = LOWORD(GetDialogBaseUnits());
        cyChar = HIWORD(GetDialogBaseUnits());
        hwndList = CreateWindow(TEXT("listbox"), NULL,
                                WS_CHILD | WS_VISIBLE | LBS_STANDARD,
                                cxChar, cyChar * 3,
                                cxChar * LF_FULLFACESIZE + GetSystemMetrics(SM_CXVSCROLL),
                                cyChar * 25,
                                hwnd, (HMENU)ID_LIST,
                                (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
                                NULL);
        hdc = GetDC(hwnd);
        iCount = DisplayFonts(hwndList, hdc);
        ReleaseDC(hwnd, hdc);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        TextOut(hdc, 10, 20, szBuffer, wsprintf(szBuffer, TEXT("共有%d种字体"), iCount));
        EndPaint(hwnd, &ps);
        return 0;
    case WM_SETFOCUS:
        SetFocus(hwndList);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}
int DisplayFonts(HWND hwnd, HDC hdc)
{
    EnumData ed;
    LOGFONT lf;
    //以下两个设置表示枚举所有的字体
    lf.lfCharSet = DEFAULT_CHARSET;
    lf.lfFaceName[0] = ‘\0‘;
    ed.iCount = 0;
    ed.hwndList = hwnd;
    //枚举字体,并显示在列表框中
    EnumFontFamiliesEx(hdc, (LPLOGFONT)&lf, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)&ed, 0);
    return ed.iCount;
}
int CALLBACK EnumFontFamExProc(
    ENUMLOGFONTEX *lpelfe,    // logical-font data
    NEWTEXTMETRICEX *lpntme,  // physical-font data
    DWORD FontType,           // type of font
    LPARAM lParam)            // application-defined data
{
    EnumData* ped = (EnumData*)lParam;
    SendMessage(ped->hwndList, LB_ADDSTRING, 0, (LPARAM)lpelfe->elfFullName);
    //TextOut(ped->hdc, ped->x, ped->y, lpelfe->elfFullName, lstrlen(lpelfe->elfFullName));
    ped->iCount++;
    return TRUE;
}

17.4.2 ChooseFont对话框

(1)CHOOSEFONT结构


字段


含义


lStructSize


结构体长度


hwndOwner


所属窗口


hdc


当Flags字段中指定CF_PRINTERFONTS时,它是打印机的DC句柄。


lpLogFont


指向一个LOGFONT结构体的指针


iPointSize


选择的字体大小,单位是1/0磅


Flags


CF_INITTOLOGFONTSTRUCT:根据ChooseFont函数中的LOGFONT初始化。

CF_TTONLY:只使用TrueType字体

CF_FIXEDPITCHONLY:只显示等宽字体

CF_SCRIPTSONLY:非符号字体

CF_SCREENFONTS:屏幕字体

CF_PRINTERFONTS:打印机字体

CF_BOTH:屏幕字体和打印机字体

CF_EFFECTS:对话框中显示“效果”复选框,包含下划线和删除复选框,还允许选择文本颜色。

CF_LIMITSIZE:显示字体的尺寸限于nSizeMin和nSizeMax之间。

CF_NOSTYLESEL:不显示“字形”组合列表框

CF_NOSIZESEL:不显示“大小”组合列表框


rgbColors


选择的字体颜色,如果Flags字段的CF_EFFECTS被设置,对话框将根据这个数值初始化“颜色”下拉列表框 。另外,函数返回时在这里返回用户选择的字体颜色。


hInstance


lpszStyle


nFontType


返回用户选择的字体是属于哪一类的,可能返回值有:BOLD_FONTTYPE、ITALIC_FONTTYPE、PRINTER_FONTTYPE、REGULAR_FONTTYPE、SCREEN_FONTTYPE等。


nSizeMin


设置用户可选择的字体最小的磅值(需指定CF_LIMITSIZE)


nSizeMax


设置用户可选择的字体最大的磅值(需指定CF_LIMITSIZE)

(2)ChooseFont函数

  ①该函数会根据像素点的大小,使用逻辑英寸为单位来计算lfHeight字段。也就是根据LOGPIXELSY来磅值转化为lfHeight。如当LOGPIXELSY=96时,需要字体的高度为1英寸,则应在“字体”对话框中选择72磅的Times Roman字体。这里ChooseFont函数返回时,LOGFONT结构的lfHeight=-96(注意,有一个负号)

  ②LONGFONT中的lfHeight使用的是逻辑坐标,所以更改映射模式时,这里的值需相应的变化。

  ③ChooseFont函数设置的LOGFONT的lfHeight字段总是使用像素为单位的,且它仅适合视频显示(参考①的说明)

  ④CHOOSEFONT字段的iPointSize表示字体的磅值的大小,以1/10磅的为单位,无论映射模式怎么改变,这个值都不会变。可以将该字段转化为逻辑尺寸供fHeight使用。

【ChooseFont程序】

/*------------------------------------------------------------
CHOOSEFONT.C -- ChooseFont Demo
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("ChosFont");
    HWND         hwnd;
    MSG          msg;
    WNDCLASSEX     wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(hInstance, szAppName);
    wndclass.hIconSm = LoadIcon(hInstance, szAppName);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = szAppName;
    wndclass.lpszClassName = szAppName;
    if (!RegisterClassEx(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
                   szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,                  // window class name
                        TEXT("ChooseFont"), // window caption
                        WS_OVERLAPPEDWINDOW,        // window style
                        CW_USEDEFAULT,              // initial x position
                        CW_USEDEFAULT,              // initial y position
                        CW_USEDEFAULT,              // initial x size
                        CW_USEDEFAULT,              // initial y size
                        NULL,                       // parent window handle
                        NULL,                       // window menu handle
                        hInstance,                  // program instance handle
                        NULL);                     // creation parameters

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static TCHAR      szText[] = TEXT("\x41\x42\x43\x44\x45 ")
        TEXT("\x61\x62\x63\x64\x65 ")
        TEXT("\xC0\xC1\xC2\xC3\xC4\xC5 ")
        TEXT("\xE0\xE1\xE2\xE3\xE4\xE5 ")
#ifdef UNICODE
        TEXT("\x0390\x0391\x0392\x0393\x0394\x0395 ")
        TEXT("\x03B0\x03B1\x03B2\x03B3\x03B4\x03B5 ")
        TEXT("\x0410\x0411\x0412\x0413\x0414\x0415 ")
        TEXT("\x0430\x0431\x0432\x0433\x0434\x0435 ")
        TEXT("\x5000\x5001\x5002\x5003\x5004")
#endif
        ;
    static CHOOSEFONT cf;
    static int cyChar;
    static LOGFONT lf;
    TEXTMETRIC tm;
    HDC         hdc;
    PAINTSTRUCT ps;
    int y;
    TCHAR szBuffer[64];
    switch (message)
    {
    case WM_CREATE:
        //获得文字的高度
        cyChar = HIWORD(GetDialogBaseUnits());
        //初始化LOGFONT结构体
        GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
        //初始化CHOOSEFONT结构体
        memset(&lf, 0, sizeof(CHOOSEFONT));
        cf.lStructSize = sizeof(CHOOSEFONT);
        cf.hwndOwner = hwnd;
        cf.hDC = NULL;
        cf.lpLogFont = &lf;
        cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS;
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDM_FONT:
            if (ChooseFont(&cf))
                InvalidateRect(hwnd, NULL, TRUE);
            return 0;
        }
        break;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);

        //用所选择的字体显示文字示例样本
        SelectObject(hdc, CreateFontIndirect(&lf));
        GetTextMetrics(hdc, &tm);
        SetTextColor(hdc, cf.rgbColors);
        TextOut(hdc, 0, y = tm.tmExternalLeading, szText, lstrlen(szText));
        DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
        //用系统字体显示LOGFONT结构体的各字段信息
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfHeight = %i"), lf.lfHeight));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfWidth = %i"), lf.lfWidth));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfEscapement = %i"), lf.lfEscapement));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfOrientation = %i"), lf.lfOrientation));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfWeight= %i"), lf.lfWeight));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfItalic = %i"), lf.lfItalic));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfUnderline = %i"), lf.lfUnderline));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfStrikeOut = %i"), lf.lfStrikeOut));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfCharSet = %i"), lf.lfCharSet));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfOutPrecision = %i"), lf.lfOutPrecision));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfClipPrecision = %i"), lf.lfClipPrecision));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfQuality = %i"), lf.lfQuality));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfPitchAndFamily = 0x%02X"), lf.lfPitchAndFamily));
        TextOut(hdc, 0, y += tm.tmHeight, szBuffer,
                wsprintf(szBuffer, TEXT("lfFaceName = %s"), lf.lfFaceName));
        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

//resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 ChooseFont.rc 使用
//
#define IDM_FONT                        40002
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//ChooseFont.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif    // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
CHOSFONT MENU
BEGIN
MENUITEM "&Font!", IDM_FONT
END
#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

【UniChars程序】

/*------------------------------------------------------------
UNICHARS.C -- Displays 16-bit character codes
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("UniChars");
    HWND         hwnd;
    MSG          msg;
    WNDCLASSEX     wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(hInstance, szAppName);
    wndclass.hIconSm = LoadIcon(hInstance, szAppName);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = szAppName;
    wndclass.lpszClassName = szAppName;
    if (!RegisterClassEx(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
                   szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,                  // window class name
                        TEXT("Unicode Characters"), // window caption
                        WS_OVERLAPPEDWINDOW | WS_VSCROLL,        // window style
                        CW_USEDEFAULT,              // initial x position
                        CW_USEDEFAULT,              // initial y position
                        CW_USEDEFAULT,              // initial x size
                        CW_USEDEFAULT,              // initial y size
                        NULL,                       // parent window handle
                        NULL,                       // window menu handle
                        hInstance,                  // program instance handle
                        NULL);                     // creation parameters

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC         hdc;
    PAINTSTRUCT ps;
    static CHOOSEFONT cf;
    static LOGFONT lf;
    TEXTMETRIC tm;
    static int iPage;
    int cxChar, cyChar, cxLabels, i, x, y;
    TCHAR szBuffer[8];
    SIZE size;
    WCHAR ch;
    switch (message)
    {
    case WM_CREATE:

        //初始化LOGFONT结构体
        hdc = GetDC(hwnd);
        lf.lfHeight = -GetDeviceCaps(hdc, LOGPIXELSY) / 6;  //96/6=12像素
        lstrcpy(lf.lfFaceName, TEXT("宋体"));
        ReleaseDC(hwnd, hdc);
        //初始化CHOOSEFONT结构体
        memset(&lf, 0, sizeof(CHOOSEFONT));  //也可以不设置,因为static属性默认各字段为0
        cf.lStructSize = sizeof(CHOOSEFONT);
        cf.hwndOwner = hwnd;
        cf.hDC = NULL;
        cf.lpLogFont = &lf;
        cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS | CF_EFFECTS;
        SetScrollRange(hwnd, SB_VERT, 0, 255, FALSE);
        SetScrollPos(hwnd, SB_VERT, iPage, TRUE);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDM_FONT:
            if (ChooseFont(&cf))
                InvalidateRect(hwnd, NULL, TRUE);
            return 0;
        }
        break;
    case WM_VSCROLL:
        switch (LOWORD(wParam))
        {
        case SB_LINEUP:        iPage -= 1;     break;
        case SB_LINEDOWN:      iPage += 1;     break;
        case SB_PAGEUP:        iPage -= 16;    break;
        case SB_PAGEDOWN:      iPage += 16;    break;
        case SB_THUMBPOSITION: iPage = HIWORD(wParam); break;
        default:
            return 0;
        }

        iPage = max(0, min(iPage, 255));
        SetScrollPos(hwnd, SB_VERT, iPage, TRUE);
        InvalidateRect(hwnd, NULL, TRUE);
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);

        SelectObject(hdc, CreateFontIndirect(&lf));
        GetTextMetrics(hdc, &tm);
        cxChar = tm.tmMaxCharWidth;  //字符的最大宽度
        cyChar = tm.tmHeight + tm.tmExternalLeading;
        cxLabels = 0;
        //计算列标题最大的宽度
        for (i = 0; i < 16; i++)
        {
            wsprintf(szBuffer, TEXT(" 000%1X: "), i); //共7个字符
            GetTextExtentPoint32(hdc, szBuffer, 7, &size);
            cxLabels = max(cxLabels, size.cx);
        }
        for (y = 0; y < 16; y++)
        {
            //列标题
            wsprintf(szBuffer, TEXT(" %03X_: "), 16 * iPage + y);
            TextOut(hdc, 0, y*cyChar, szBuffer, 7);
            for (x = 0; x < 16; x++)
            {
                ch = (WCHAR)(256 * iPage + 16 * y + x); //每页中的数据
                //x*cxChar + cxLabels:加cxLabels,就是从列标题后开始输出
                TextOutW(hdc, x*cxChar + cxLabels, y*cyChar, &ch, 1); //用宽字符版的TextOut
            }
        }
        DeleteObject(SelectObject(hdc, GetStockObject(SYSTEM_FONT)));
        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

//resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 UniChars.rc 使用
//
#define IDM_FONT                        40002
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//UniChars.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif    // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
UNICHARS MENU
BEGIN
MENUITEM "&Font!", IDM_FONT
END
#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
时间: 2024-11-01 01:09:26

第17章 文本和字体_17.4 字体枚举的相关文章

第17章 文本和字体_17.1-17.2 简单文本输出、 字体的背景知识

17.1 简单文本输出 17.1.1 文本输出函数 (1)TextOut(hdc,xStart,yStart,pString,iCount) ①xStart和yStart使用的是逻辑坐标,TextOut并不以NULL来做字符串的结束,需指定字符的个数iCount的值 ②SetTextAlign会改变xStart和yStart的含义 SetTextAlign 坐标值的含义 TA_LEFT xStart:第一个字符的左侧坐标 TA_RIGHT xStart:最后一个字符的右侧坐标 TA_CENTER

第17章 文本和字体_17.3 逻辑字体

17.3 逻辑字体 17.3.1 逻辑字体的创建和选择 (1)创建逻辑字体 hFont= CreateFontIndirect(&lf); //其中LOGFONT为结构体 (2)SelectObject(hdc,hFont); //选入并匹配字体或使用从ChooseFont中选择的字体 (3)返回选入设备环境的字体信息: ①GetTextFace(hdc,sizeof(szFaceName)/sizeof(TCHAR),szFaceName);//返回字样名称 ②GetTextMetrics(h

第17章 文本和字体_17.5 设置段落格式

17.5 设置段落格式 17.5.1 设置简单的文本格式 (1)对齐方式及起始坐标:设字符串的长度为size.cx 对齐方式 文本输出的起始位置(设输出框左右边界分别为xLeft.XRight) 左对齐 xStart =xLeft; 右对齐 xStart = xRight – size.cx 中间对齐 xStart = (xLeft + xRight –size.cx) /2 两端对齐 xStart = xLeft,但要调用SetTextJustification进行调整 (2)两个重要函数 ①

第17章 文本和字体_17.6 一些有趣和新奇的内容

17.6 一些有趣和新奇的内容 17.6.1 GDI路径 (1)路径的创建 BeginPath(hdc); //1.使用任何绘制线的函数在DC上绘制,被存在GDI内部,但不显示出来. //2.可以在当前路径中创建一个新的子路径,其中每个子路径都是一系列互相连接的线. //3.每个子路径可以是闭合的,也可以是开放的.要闭合子路径时,可以用CloseFigure将子路径闭合,必要时会自动添加一条直线以达到些目的.其后用任何画线函数创建的都是新的子路径. EndPath(hdc); (2)五个与路径有

CSS3秘笈第三版涵盖HTML5学习笔记13~17章

第13章,构建基于浮动的布局 使用的是float(浮动)属性 注:float:none值将取消所有浮动,通常只用来取消元素中已经应用的浮动. 切记:不需要给正文的div设计宽度,即使设计成固定宽度也不用 用浮动进行布局 LayoutGala网站(http://blog.html.it/layoutgala/)上提供了40种不同的CSS设计,但大多只是基本框架,里面只有<div>标签及其定位用的CSS代码 布局生成器,Cridinator(http://gridinator.com)提供了简单的

JavaScript高级程序设计(第三版)学习笔记11、12、17章

第11章, DOM扩展 选择符 API Selector API Level1核心方法querySelector .querySelectorAll,兼容的浏览器可以使用 Document,Element 实例调用它们,支持浏览器:IE8+,Firefox3.5+,Safari3.1+,chrome,Opera10+ querySelector方法 接收一个 CSS选择符,返回与该模式匹配的第一个元素 通过 Document类型调用该函数,会在文档范围查找匹配元素,通过 Element类型调用该

第十五章 文本样式(上)

第 15章 CSS文本样式[上]学习要点:1.字体总汇2.字体设置3.Web字体 本章主要探讨 HTML5中 CSS文本样式,通过文本样式的设置,更改字体的大小.样式以及文本的方位.一.字体总汇本节课,我们重点了解一下 CSS文本样式中字体的一些设置方法,样式表如下:属性名 说明font-size 设置字体的大小font-variant 设置英文字体是否转换为小型大写font-style 设置字体是否倾斜font-weight 设置字体是否加粗font-family 设置 font字体font

Linux 第一章文本安装 red hat

享受生活  热爱挑战 明远分享 Linux 第一章文本安装 red hat 每章一段话 有些人似荷,只能远观:有些人似茶,可以细细品味:有些人似风,不必在意:有些人是树,值得依靠.人生就像是一场修行,修的就是一颗心.心顺,一切就会完美:心静,出境就会美好:心乐,人生就幸福了.多点踏实,少点浮躁,活得真实才能自在. 目标:   学会用文本方式安装red hat (建议先练习图形化安装,对比着学习文本安装) 理论部分: 一丶了解linux的系统内核 对于操作系统来说,内核就好像是人的"心脏"

第十九章 文本处理流编辑器:awk编程

第十九章 文本处理流编辑器:awk编程 名词解释 awk 是一种编程语言,用于linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件.或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大个编程工具.它在命令行中使用,但更多是作为脚本来使用.awk有很多内建的功能,比如:数组.函数等,这是它和C语言的相同之处,灵活性是awk最大的优势. awk命令格式和选项 语法形式 awk [option] 'script'