WINCE5.0应用程序字体的动态加载(原创)

       大家知道,字体文件对于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平台上测试通过。

 

声明: 如果需转载本文,请注明原文作者及出处的链接,否则本人将追究其责任!

 

posted @ 2010-05-10 00:11  Jade  阅读(2478)  评论(0编辑  收藏  举报