大家知道,字体文件对于WINCE系统来说,一般都比较庞大,一般在2MB-15MB之间,如果在WINCE的NK中定制几种字体或者大容量字体,势必会增加NK的大小,这对嵌入式系统是不现实的。
好在WINCE系统提供了动态加载字体的API: AddFontResource, 利用这个API函数,我们可以动态加载字体,我们可以把字体放在NAND FLASH中,也可以放在SD卡上,因此不必担心NK会变大,消耗宝贵的FLASH资源问题。而且我们可以根据需要加载多个字体(注意:如果加载的字体太多或太大,也会占用系统内存)。但是要注意的是,系统退出时,记得要卸载动态加载的字体,否则会引起内存泄露。应用过程中,需要注意的问题是:结构体LOGFONT 的成员lfFaceName,应该为字体名,字体名在WINDOWS下,直接打开字体,最上面一行就有字体名显示。
闲话少说,贴上关键代码:
#define CUSTOM_FONT L"Storage Card//FZY3JW.TTF"
/
// CFont_testDlg message handlers
BOOL CFont_testDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
if (NULL != AddFontResource(CUSTOM_FONT))
{
::SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
else
{
AfxMessageBox(L"加载方正准圆简体字体失败!");
}
if(NULL!= AddFontResource(XINGKAI_FONT))
{
::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
else
{
AfxMessageBox(L"加载行楷简体字体失败!");
}
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
WCHAR lffn[]= TEXT("方正准圆简体");
wcscpy(lf.lfFaceName,lffn);
lf.lfHeight = 20;
lf.lfWidth = 0;
lf.lfQuality = CLEARTYPE_QUALITY;
lf.lfCharSet = GB2312_CHARSET;
//hFontNew = CreateFontIndirect(&lf);
hFontNew.CreateFontIndirect(&lf);
GetDlgItem(IDC_STC_TEXT)->SetFont(&hFontNew);
return TRUE; // return TRUE unless you set the focus to a control
}
程序退出后,记得卸载字体,否则会造成内存泄露:
if(RemoveFontResource(CUSTOM_FONT))
{
::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
else
AfxMessageBox(L"Failed to UNLOAD font!");
上述代码经过本人在WINCE5.0模拟器和三星2440平台上测试通过。
作者:Jade
原文地址:http://www.cnblogs.com/Jade2009/archive/2010/05/10/1731444.html