我遇到了创建字体的问题,而不是默认情况下在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);
}
答案 0 :(得分:0)
仅将字体放在Fonts文件夹中是不够的。 CE不会在桌面操作系统等文件副本上自动加载它们。你必须手动加载它。加载字体在this blog entry中列出。
答案 1 :(得分:0)
问题只是字体名称,我使用的是字体文件本身的名称,而不是字体名称,这真的不同,我不知道。
我偶然发现这个,当我调试枚举设备上可用字体的代码时,我发现字体的文件名和字体名称之间存在差异,所以我试了一下脸结构 ENUMLOGFONT 的成员变量 elfFullName 给出的名称,英文字体一切正常,但阿拉伯字体不起作用:D
所以我想我会继续寻找为什么阿拉伯字体不起作用,如果你有任何建议,我真的很感激他们。