C++ 当我请求一个;“米里亚姆”;在Windows中,我得到一个“字体”;Arial“;字体。这是怎么可能的,因为字体文件;mriam.ttf“;是否存在于我的系统中?

C++ 当我请求一个;“米里亚姆”;在Windows中,我得到一个“字体”;Arial“;字体。这是怎么可能的,因为字体文件;mriam.ttf“;是否存在于我的系统中?,c++,winapi,windows-7,fonts,C++,Winapi,Windows 7,Fonts,在下面的代码中,Miriam字体是在WM_CREATE中创建的,它的姓氏是在静态OUTLINETEXTMETRIC结构中获得的,由s_potm指向。然后我在WM_PAINT中展示此结构的成员otmpFamilyName,并将字符串Arial打印在窗口客户端区域,而不是Miriam。但是没有理由进行这种字体替换,因为Windows 7中存在字体文件mriam.ttf。有什么解释吗 #include <windows.h> LRESULT CALLBACK WndProc(HWND,

在下面的代码中,
Miriam
字体是在
WM_CREATE
中创建的,它的姓氏是在静态
OUTLINETEXTMETRIC结构中获得的,由
s_potm
指向。然后我在
WM_PAINT
中展示此结构的成员
otmpFamilyName
,并将字符串
Arial
打印在窗口客户端区域,而不是
Miriam
。但是没有理由进行这种字体替换,因为Windows 7中存在字体文件
mriam.ttf
。有什么解释吗

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, UINT, LONG);

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int nCmdShow)
{
    WNDCLASSEX  wndclassx;

    wndclassx.cbSize        = sizeof(WNDCLASSEX);
    wndclassx.style         = CS_HREDRAW | CS_VREDRAW;
    wndclassx.lpfnWndProc   = WndProc;
    wndclassx.cbClsExtra    = 0;
    wndclassx.cbWndExtra    = 0;
    wndclassx.hInstance     = hInstance;
    wndclassx.hIcon         = 0;
    wndclassx.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wndclassx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wndclassx.lpszMenuName  = 0;
    wndclassx.lpszClassName = L"WndProc";
    wndclassx.hIconSm       = 0;

    if( !RegisterClassEx(&wndclassx) ) return 0;

    HWND hWnd = CreateWindow(L"WndProc", 0, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                             0, 0, hInstance, 0);

    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    MSG msg;

    while( GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    //  Retorna msg.wParam

    return (int)msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
    static OUTLINETEXTMETRIC* s_potm;

    switch ( message )
    {
        case WM_CREATE:
        {
            HDC hDC;
            if( !(hDC = CreateIC(L"Display", nullptr, nullptr, nullptr)) ) return -1;

            LOGFONT lf;
            memset(&lf, 0, sizeof(LOGFONT));
            lf.lfHeight = 20;
            lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
            wcscpy_s(lf.lfFaceName, LF_FACESIZE, L"Miriam");

            HFONT hFont;
            if( !(hFont = CreateFontIndirect(&lf)) )
            {
                DeleteDC(hDC);
                return -1;
            }

             hFont = (HFONT)SelectObject(hDC, hFont);

             int ix = GetOutlineTextMetrics(hDC, 0, nullptr);

             s_potm = (OUTLINETEXTMETRIC*)new char[ix];

             GetOutlineTextMetrics(hDC, ix, s_potm); 

             DeleteObject(SelectObject(hDC, hFont));
             DeleteDC(hDC);
        }
        break;

        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(hwnd, &ps);
            wchar_t* p = (wchar_t*)((BYTE*)s_potm + (int)s_potm->otmpFamilyName);
            TextOut(ps.hdc, 10, 20, p, wcslen(p)); 
            EndPaint(hwnd, &ps);
        }
        break;

        case WM_DESTROY:

        PostQuitMessage(0);
        break;

        default:

        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
#包括
LRESULT回调WndProc(HWND、UINT、UINT、LONG);
int APICENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR pszCmdLine、int nCmdShow)
{
wndclassx wndclassx;
wndclassx.cbSize=sizeof(wndclassx);
wndclassx.style=CS_HREDRAW | CS_VREDRAW;
wndclassx.lpfnWndProc=WndProc;
wndclassx.cbClsExtra=0;
wndclassx.cbWndExtra=0;
wndclassx.hInstance=hInstance;
wndclassx.hIcon=0;
wndclassx.hCursor=LoadCursor(空,IDC_箭头);
wndclassx.hbrBackground=(HBRUSH)(彩色窗口+1);
wndclassx.lpszMenuame=0;
wndclassx.lpszClassName=L“WndProc”;
wndclassx.hIconSm=0;
如果(!RegisterClassEx(&wndclassx))返回0;
HWND HWND=CreateWindow(L“WndProc”,0,WS_重叠窗口,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
0,0,0);
显示窗口(hWnd、SW_显示正常);
更新窗口(hWnd);
味精;
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
//特雷纳味精
返回(int)msg.wParam;
}
LRESULT回调WndProc(HWND HWND,UINT消息,UINT wParam,长LPRAM)
{
静态OUTLINETEXTMETRIC*s_potm;
开关(信息)
{
案例WM_创建:
{
HDC-HDC;
if(!(hDC=CreateIC(L“Display”,nullptr,nullptr,nullptr)))返回-1;
LOGFONT-lf;
memset(&lf,0,sizeof(LOGFONT));
lf.lf高度=20;
lf.lfOutPrecision=OUT\u TT\u ONLY\u precision;
wcscpy_s(左脸姓名,左脸大小,L“Miriam”);
HFONT-HFONT;
if(!(hFont=CreateFontIndirect(&lf)))
{
DeleteDC(hDC);
返回-1;
}
hFont=(hFont)选择对象(hDC,hFont);
int ix=GetOutlineTextMetrics(hDC,0,nullptr);
s_potm=(OUTLINETEXTMETRIC*)新字符[ix];
GetOutlineTextMetrics(hDC、ix、s_potm);
DeleteObject(SelectObject(hDC,hFont));
DeleteDC(hDC);
}
打破
案例WM_油漆:
{
PAINTSTRUCT-ps;
开始油漆(hwnd和ps);
wchar_t*p=(wchar_t*)((字节*)s_potm+(int)s_potm->otmpFamilyName);
TextOut(ps.hdc,10,20,p,wcslen(p));
端漆(hwnd和ps);
}
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hwnd、message、wParam、lParam);
}
返回0;
}

编辑:字体
MT Extra

当您向Windows请求字体时,它会尽力匹配您在LOGFONT结构中列出的所有条件。某些字段优先于其他字段。您将大多数值保留为零

我认为在这种情况下,是
lfCharSet
字段让您感到困惑。零等于ANSI_字符集,但Miriam看起来不像ANSI字体

MSDN文档说明了有关
lfCharSet

此参数在字体映射过程中很重要。要确保结果一致,请指定特定的字符集。如果在lfFaceName成员中指定字体名称,请确保lfCharSet值与lfFaceName中指定的字体字符集匹配


当您向Windows请求字体时,它会尽力匹配您在LOGFONT结构中列出的所有条件。某些字段优先于其他字段。您将大多数值保留为零

我认为在这种情况下,是
lfCharSet
字段让您感到困惑。零等于ANSI_字符集,但Miriam看起来不像ANSI字体

MSDN文档说明了有关
lfCharSet

此参数在字体映射过程中很重要。要确保结果一致,请指定特定的字符集。如果在lfFaceName成员中指定字体名称,请确保lfCharSet值与lfFaceName中指定的字体字符集匹配


这取决于你从哪个铸造厂得到的,但是Miriam的Linotype版本是OpenType字体,而不是TrueType字体。确切地说,如何使用OpenType是一个非常保密的秘密,我只知道WPF对它的支持?如果FACESIZE是32,可能需要指定确切的长度。@HansPassant
Arial、Calibri、Cambria和Times New Roman
都是OpenType字体。如果您将代码上的
Miriam
字体替换为这些字体中的任何一种,您将在
otmpFamilyName
成员中得到正确的结果。@kol
lf.lfFaceName
包含以零结尾的字符串“Miriam”。我当然能识别这些字体名称,它们是我机器上的TrueType字体,而不是OT字体。在任何Windows机器上都可以。这取决于你是从哪个铸造厂得到的,但是Miriam的Linotype版本是OpenType字体,而不是TrueType字体。确切地说,如何使用OpenType是一个非常保密的秘密,我只知道WPF对它的支持?如果你的脸型是32,也许你