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平台上测试通过。

 

 作者:Jade

 原文地址:http://www.cnblogs.com/Jade2009/archive/2010/05/10/1731444.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值