Fonts 如何在WinCe设备中更改字体类型

Fonts 如何在WinCe设备中更改字体类型,fonts,windows-ce,font-size,Fonts,Windows Ce,Font Size,我在WinCE设备上工作,在GDI上工作,因为我正在尝试更改字体类型,我已启用目录项中的所有字体类型(Arial、Comic Sans MS、Courier New、Georgia、Tahoma、Times New Roman、Trebuchet MS、Veradana),我想使用这些字体,但这些字体不起作用,设备仅使用默认字体 下面给出了我正在使用的代码 void CreateText () { // First, clear all fields. memset (&logfont,

我在WinCE设备上工作,在GDI上工作,因为我正在尝试更改字体类型,我已启用目录项中的所有字体类型(Arial、Comic Sans MS、Courier New、Georgia、Tahoma、Times New Roman、Trebuchet MS、Veradana),我想使用这些字体,但这些字体不起作用,设备仅使用默认字体

下面给出了我正在使用的代码

void CreateText ()
{
// First, clear all fields.
memset (&logfont, 0, sizeof (logfont));

// Create a GDI Times New Roman font.
logfont.lfHeight = 20;
logfont.lfWidth = 0; 
logfont.lfEscapement = 0;
logfont.lfOrientation = 0;
logfont.lfWeight = FW_BOLD;
logfont.lfItalic = TRUE;//FALSE;
logfont.lfUnderline = FALSE;
logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;    
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = DEFAULT_QUALITY;
logfont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
_tcsncpy (logfont.lfFaceName, TEXT("Arial"), LF_FACESIZE);  //Comic Sans MS 
logfont.lfFaceName[LF_FACESIZE-1] = TEXT('\0');  // Ensure null termination
hfontTimes = CreateFontIndirect (&logfont);
//CreatePointFontIndirect(&logfont);
if (!hfontTimes)   {
    // CreateFontIndirect failed. Insert code here for error
    // handling.
    printf("\n CreateFontIndirect failed... ");
}

//SendMessage(NULL,WM_SETREDRAW,(WPARAM)TRUE,NULL);

}

void initiateText ()
{
// Get a GDI DC onto the backbuffer, where you will render the text.
hdcSurface = GetDC (NULL);

// Select the font into the DC.
hfontSave = (HFONT) SelectObject (hdcSurface, hfontTimes);

// Set the background mode to transparent, so there is no
// rectangle behind the text.
SetBkMode (hdcSurface, TRANSPARENT);
}


void printText (HDC      hdcSurface, 
                int      screen_x,
                int      screen_y,
                LPTSTR   lpszText,
                COLORREF color)
{
int bReturn;

// Set text color.
SetTextColor (hdcSurface, color);

bReturn = ExtTextOut (hdcSurface,
                      screen_x,
                      screen_y,
                      0,                  // No flags set
                      NULL,               // No clipping rectangle
                      lpszText,           // String to display
                      lstrlen (lpszText), // Number of characters
                      NULL);              // Use default spacing.
}

如上所述,所选字体未显示在屏幕上,正在寻找您的建议。

步骤1是确定字体是否实际在系统中并已注册。调用将告诉您操作系统实际看到了什么,以及
lfFaceName
参数需要使用的确切名称

编辑

如果在枚举时字体没有显示,则说明它们不在操作系统中。他们没有进入操作系统可能有很多原因。查看操作系统映像的
BUILDRELDIR
,看看它们是否在那里。如果它们是,那么听起来你没有
makeimg
将它们放入实际的操作系统中。还要检查
ce.bib
,查看构建系统是否实际被告知包含它们(某些项目或平台文件可能已明确排除它们)


最后一种强力方法是确保字体文件在设备上,然后在应用程序启动时调用
AddFontResource

我想使用这些字体,但这些字体不起作用,设备仅使用默认字体,
这是什么意思??你是如何测试的??如果您想测试是否添加了字体,请打开Word编辑器并查看“字体”下拉菜单。。像这样,只有您测试过??我使用了EnumFontFamilies()函数,在默认字体中,它只提供“Arial”,但在启用目录项中的所有字体时,它还需要显示其他字体,但其余字体没有提供可能错误的内容。我已在字体存在的两个位置签入OS image和ce.bib文件,我已经尝试过AddFontResource(),它给出了无效的_数据之类的错误感谢您的响应,得到了问题的解决方案,在增加程序内存大小后,一切都正常工作。