现在的位置: 首页 > 综合 > 正文

WINCE自己加载自己想要的字体

2013年10月19日 ⁄ 综合 ⁄ 共 1581字 ⁄ 字号 评论关闭

 好在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!");

 

 

抱歉!评论已关闭.