Fonts 在Windows CE上创建和使用字体

Fonts 在Windows CE上创建和使用字体,fonts,windows-ce,Fonts,Windows Ce,我面临的问题是创建一种字体,而不是windows文件夹中默认的字体,并使用这种字体在屏幕上绘制一些文本 我所做的只是将此字体添加到windows文件夹中,然后在代码中,我使用CreateFontIndirect函数创建字体,传递所需的LOGFONT结构,该结构具有适当的变量,尤其是lfFaceName变量,然后在设备上下文中选择此字体,最后绘制一些字符串,但没有任何效果,真正有效的字体只有arial、cour、times和tahoma,这是默认的系统字体,即使使用这些默认字体,您也无法真正理解它

我面临的问题是创建一种字体,而不是windows文件夹中默认的字体,并使用这种字体在屏幕上绘制一些文本

我所做的只是将此字体添加到windows文件夹中,然后在代码中,我使用CreateFontIndirect函数创建字体,传递所需的LOGFONT结构,该结构具有适当的变量,尤其是lfFaceName变量,然后在设备上下文中选择此字体,最后绘制一些字符串,但没有任何效果,真正有效的字体只有arial、cour、times和tahoma,这是默认的系统字体,即使使用这些默认字体,您也无法真正理解它们之间的真正区别

那么有什么具体的方法可以做到这一点吗?或者,由于Windows CE的某些限制,这件事无法完成,或者具体是什么

谢谢你们,非常感谢你们的帮助:)

更新:为了清晰起见,这里有一些代码

BOOL OnInitDialog()
{
    . . . .

    if (AddFontResource(L"\\windows\\spaceage.ttf") == 1)
    {
         OutputDebugString(L"Font added successfully");

         ::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
    }

    . . . .
}

void OnPaint()
{
    CPaintDC dc(this);

    HDC hdcMem = ::CreateCompatibleDC(dc);

    HBITMAP hbmpMem = ::CreateCompatibleBitmap(dc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));

    HBITMAP hbmpMemOld = (HBITMAP)::SelectObject(hdcMem, hbmpMem);

    int iPointSize = 12;

    wstring strFontName = L"spaceage";

    HFONT hFontOld;

    LOGFONT lf;
    memset(&lf, 0, sizeof(LOGFONT));

    int iFontHeight = -1 * (iPointSize * ::GetDeviceCaps(hdcMem, LOGPIXELSY) / 72);

    memset(&lf, 0, sizeof(LOGFONT));

    lf.lfHeight = iFontHeight;
    lf.lfWeight = FW_NORMAL;

    lstrcpy(lf.lfFaceName, m_strFontName.c_str());

    HFONT hFont = ::CreateFontIndirect(&lf);

    if(hFont != NULL)
    {
        hFontOld = (HFONT)::SelectObject(hdcMem, hFont);
    }

    . . . . .

    // do some stuff here

    // draw some text here

    . . . . . 

    ::BitBlt(dc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), hdcMem, 0, 0, SRCCOPY);

    ::SelectFont(hdcMem, hOldFont);
    ::SelectObject(hdcMem, hbmpMemOld);
    ::DeleteObject(hbmpMem);
    ::DeleteDC(hdcMem);
}

仅仅将字体放入字体文件夹是不够的。CE不会像桌面操作系统那样将它们自动加载到文件副本上。您必须手动加载它。加载字体如中所述。

仅将字体放入字体文件夹是不够的。CE不会像桌面操作系统那样将它们自动加载到文件副本上。您必须手动加载它。加载字体如中所述。

问题只是字体名称,我使用的是字体文件本身的名称,而不是字体名称,字体名称确实不同,我不知道这一点

我很偶然地发现了这一点,当我调试列举设备上可用字体的代码时,我发现字体的文件名和字体名称之间存在差异,因此,我尝试了structENUMLOGFONT的成员变量elfFullName给出的面名,英语字体一切正常,但阿拉伯语字体不起作用:D


因此,我想我会继续寻找为什么阿拉伯语字体不起作用,如果各位有任何建议,我真的会很感激的。

问题只是字体名称,我使用的是字体文件本身的名称,而不是字体名称,字体名称真的不同,我不知道

我很偶然地发现了这一点,当我调试列举设备上可用字体的代码时,我发现字体的文件名和字体名称之间存在差异,因此,我尝试了structENUMLOGFONT的成员变量elfFullName给出的面名,英语字体一切正常,但阿拉伯语字体不起作用:D


因此,我想我会继续寻找为什么阿拉伯语字体不起作用,如果各位有任何建议,我将非常感谢。

谢谢你们的回答,我的朋友。我知道这个事实,所以我用我添加的字体名称调用了AddFontResource函数,并发送了WM_FONTCHANGE,但这也不起作用。ctacke,我昨天编辑了这篇文章,这没有任何帮助吗?您是否验证了在LOGFONT中设置的字体名称与枚举已安装字体时在LOGFONT中返回的名称完全匹配?如果名称不匹配,它将返回到系统字体。问题是,在找到字体后,调用AddFontResource,然后发送WM_FONTCHANGE消息,在第二次EnumFontFamilies调用中,查看字体是否添加到系统中,它们不会出现,好像没有添加或找到任何内容。谢谢您的回答,我的朋友。我知道这个事实,所以我用我添加的字体名称调用了AddFontResource函数,并发送了WM_FONTCHANGE,但这也不起作用。ctacke,我昨天编辑了这篇文章,这没有任何帮助吗?您是否验证了在LOGFONT中设置的字体名称与枚举已安装字体时在LOGFONT中返回的名称完全匹配?如果名称不匹配,它将返回到系统字体。问题是,在找到字体后,调用AddFontResource,然后发送WM_FONTCHANGE消息,在第二个EnumFontFamilies调用以查看字体是否已添加到系统中,它们不会出现,好像没有添加或找到任何内容。