如何在不安装字体的情况下使用字体(字体解析库)

您所在的位置:网站首页 愿的字体 如何在不安装字体的情况下使用字体(字体解析库)

如何在不安装字体的情况下使用字体(字体解析库)

2024-07-14 10:41| 来源: 网络整理| 查看: 265

下载演示项目-206.31 KB下载源243.93 KB 目录 介绍GDI的AddFontResourceExGDI的AddFontMemResourceExGDI +的PrivateFontCollection的AddFontFileGDI +的PrivateFontCollection的AddMemoryFont获取TTF和TTC字体名称将字体文件添加到资源结论参考历史

 

介绍

很多时候,由于内部图形设计人员会选择字体,因此需要在应用程序中使用特定字体。为了使应用程序使用字体,需要使用安装程序来安装字体。用户计算机上的字体过多可能会大大降低系统速度。

实际上,您无需安装字体就可以摆脱困境:作为程序员,GDI和GDI +分别为您提供了两种添加字体的方式,供应用程序使用而无需安装字体。我将在本文中向您展示!

GDI的AddFontResourceEx

首先让我谈谈GDI的两个向应用程序添加字体的功能。然后,我将讨论GDI +自身的功能。您可以使用AddFontResourceEx添加物理字体文件供应用程序使用。

int AddFontResourceEx( LPCTSTR lpszFilename, // font file name DWORD fl, // font characteristics PVOID pdv // reserved );

 

这是一个使用方法的例子AddFontResourceEx:

CString szFontFile = "D:\\SkiCargo.ttf"; int nResults = AddFontResourceEx( m_szFontFile, // font file name FR_PRIVATE, // font characteristics NULL);

 

要使用添加的字体,只需在CreateFont或CreateFontIndirect函数中指定其名称即可,就像其他已安装的字体一样。要知道字体的名称,只需在Windows资源管理器中右键单击TTF扩展名文件,然后选择“打开”即可看到其实际名称。或者,您可以使用我编写的TTF和TTC类来了解字体名称。

注意:本文中的字体文件名称(“ SkiCargo.ttf ”)实际上是其字体名称“ SkiCargo”;通常不是这种情况!为了安全起见,请使用Windows资源管理器右键单击方法或刚才提到的TTFand TTC类来查找名称!

CClientDC dc(this); dc.SetBkMode(TRANSPARENT); LOGFONT lf; memset(&lf, 0, sizeof(lf)); lf.lfHeight = -MulDiv(24, pDC->GetDeviceCaps(LOGPIXELSY), 72); lf.lfWeight = FW_NORMAL; lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; wcscpy_s(lf.lfFaceName, L"SkiCargo"); // create and select it CFont newFont; if (!newFont.CreateFontIndirect(&lf)) return; CFont* pOldFont = dc.SelectObject(&newFont); // use a path to record how the text was drawn wchar_t buf[] = _T("The quick brown fox jumps over the lazy dog!"); dc.TextOut( 10, 10, buf, wcslen(buf)); // Put back the old font dc.SelectObject(pOldFont);

 

您必须记得RemoveFontResourceEx在应用程序退出之前先打电话。您应该注意,这些参数必须与您输入的参数相同AddFontResourceEx!

BOOL RemoveFontResourceEx( LPCTSTR lpFileName, // name of font file DWORD fl, // font characteristics PVOID pdv // Reserved. ); CString szFontFile = "D:\\SkiCargo.ttf"; BOOL b = RemoveFontResourceEx( m_szFontFile, // name of font file FR_PRIVATE, // font characteristics NULL // Reserved. );

 

GDI的AddFontMemResourceEx

如果我们的字体位于资源DLL,cabinet文件或档案压缩文件中,则可以将其提取到内存中,然后用于AddFontMemResourceEx从内存中读取它。

HANDLE AddFontMemResourceEx( PVOID pbFont, // font resource DWORD cbFont, // number of bytes in font resource PVOID pdv, // Reserved. Must be 0. DWORD *pcFonts // number of fonts installed );

 

这是一个如何AddFontMemResourceEx在资源中嵌入的字体文件上使用示例。注意:要了解如何将字体文件添加到资源中,可以在本文后面参考本节。

HINSTANCE hResInstance = AfxGetResourceHandle( ); HRSRC res = FindResource(hResInstance, MAKEINTRESOURCE(IDR_MYFONT),L"BINARY"); if (res) { HGLOBAL mem = LoadResource(hResInstance, res); void *data = LockResource(mem); size_t len = SizeofResource(hResInstance, res); DWORD nFonts; m_fonthandle = AddFontMemResourceEx( data, // font resource len, // number of bytes in font resource NULL, // Reserved. Must be 0. &nFonts // number of fonts installed ); if(m_fonthandle==0) { MessageBox(L"Font add fails", L"Error"); } }

 

要使用添加的字体,请参考前面的AddFontResourceEx示例。他们是一样的。就像其他已安装的字体一样使用它。您应RemoveFontMemResourceEx在应用程序退出之前致电。处理结束后,即使您不致电,系统也会卸载字体RemoveFontMemResourceEx。注意:参数必须与您输入的参数相同AddFontResourceEx!

BOOL RemoveFontMemResourceEx( HANDLE fh // handle to the font resource ); if(m_fonthandle) { BOOL b = RemoveFontMemResourceEx(m_fonthandle); if(b==0) { MessageBox(L"Font remove fails", L"Error"); } }

 

GDI +的PrivateFontCollection的AddFontFile

对于GDI +,您可以使用其PrivateFontCollection类成员AddFontFile添加物理字体文件。

Status AddFontFile(const WCHAR* filename);

 

这是AddFontFile添加字体文件的方法:

Gdiplus::PrivateFontCollection m_fontcollection; //... CString szFontFile = szExePath + L"SkiCargo.ttf"; Gdiplus::Status nResults = m_fontcollection.AddFontFile(szFontFile);

 

这是使用刚刚添加到PrivateFontCollection对象中的字体的方法m_fontcollection。

// When painting the text FontFamily fontFamily; int nNumFound=0; m_fontcollection.GetFamilies(1,&fontFamily,&nNumFound); if(nNumFound>0) { Font font(&fontFamily,28,FontStyleRegular,UnitPixel); StringFormat strformat; wchar_t buf[] = L"The quick brown fox jumps over the lazy dog!"; graphics.DrawString(buf,wcslen(buf),&font, PointF(10.0f,10.0f),&strformat,&brush); }

 

注意:与GDI的AddFontResourceEx和不同AddFontMemResourceEx,没有RemoveFontFilefor AddFontFile。所有添加的字体都会被PrivateFontCollection的析构函数删除。

GDI +的PrivateFontCollection的AddMemoryFont

对于GDI +,您可以使用其PrivateFontCollection类成员AddMemoryFont在内存中添加字体。

Status AddMemoryFont(const VOID *memory, INT length);

 

这是AddMemoryFont在资源中嵌入的字体文件上使用方法。与相似AddFontFile,没有RemoveMemoryFont呼叫。PrivateFontCollection的析构函数将处理所有事情。注意:要了解如何将字体文件添加到资源中,可以在本文后面参考本节。

HINSTANCE hResInstance = AfxGetResourceHandle( ); HRSRC res = FindResource(hResInstance, MAKEINTRESOURCE(IDR_MYFONT),L"BINARY"); if (res) { HGLOBAL mem = LoadResource(hResInstance, res); void *data = LockResource(mem); size_t len = SizeofResource(hResInstance, res); Gdiplus::Status nResults = m_fontcollection.AddMemoryFont(data,len); if(nResults!=Gdiplus::Ok) { MessageBox(L"Font add fails", L"Error"); } }

 

至于如何使用刚刚添加到PrivateFontCollection对象中的字体m_fontcollection,请参考前面的AddFontFile示例,它们是相同的。

获取TTF和TTC字体名称

我编写了两个类,分别是TTF和,分别TTC从TTF / OTF和TTC字体文件中读取字体名称。为了支持Matroska(mkv)文件字体读取或嵌入式字体资源读取,my TTF和TTCclass支持解析内存中的字体文件。仅供参考,这些Matroska文件通常包含视频通道,多种语言的音频通道,字幕以及视频中字幕的字体。我的课程非常易于使用。下面是一个以物理方式或在内存中读取TTF文件并显示其信息的示例:

void TestReadTtfFromFile(const std::wstring& szFile) { TTF ttf; ttf.Parse(szFile); Display(ttf); } void TestReadTtfFromMemory(const std::wstring& szFile) { struct _stat bufferStat; int nRet = _wstat(szFile.c_str(), &bufferStat); FILE* pFile = _wfopen(szFile.c_str(), L"rb"); if(pFile == NULL) { std::wcout{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by TestGDI_AddFontMem.RC // #define IDR_MAINFRAME 128 #define IDD_TESTGDI_ADDFONTMEM_DIALOG 102 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 32771 #endif #endif{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by TestGDI_AddFontMem.RC // #define IDR_MAINFRAME 128 #define IDD_TESTGDI_ADDFONTMEM_DIALOG 102 #define IDR_MYFONT 129 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 130 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 32771 #endif #endif


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3