天天看點

GetFontUnicodeRanges擷取指定字型檔案中的字元

AddFontResourceExW函數(wingdi.h)

該AddFontResourceEx功能添加從指定的檔案到系統的字型資源。使用AddFontResourceEx函數添加的字型可以标記為私有且不可枚舉。

函數

int AddFontResourceExW(
  LPCWSTR name,
  DWORD   fl,
  PVOID   res
);
           

name:

指向以空字元結尾的字元串的指針,該字元串包含有效的字型檔案名。此參數可以指定以下任何檔案。

要添加資訊來自多個資源檔案的字型,請将lpszFileName指向一個字元串,檔案名之間用|分隔。-例如,abcxxxxx.pfm | abcxxxxx.pfb。

fl:

要添加到系統的字型的特征。此參數可以是以下值之一。

表2

價值 意義
FR_PRIVATE 指定隻有調用AddFontResourceEx函數的程序才能使用此字型。當字型名稱與公共字型比對時,将選擇私有字型。當程序終止時,系統将使用AddFontResourceEx函數删除該程序安裝的所有字型。
FR_NOT_ENUM 指定沒有任何程序(包括調用AddFontResourceEx函數的程序)可以枚舉此字型。

res:

必須為零。

傳回值

如果函數成功,則傳回值指定添加的字型數量。

如果函數失敗,則傳回值為0。

使用方法

該函數GetFontUnicodeRanges 需要調用2次, 第一次使其第二個參數為NULL,目的是獲得GLYPHSET 對象所需空間,然後配置設定空間

最後,再次調用GetFontUnicodeRanges函數,此時第二個參數為剛配置設定好空間的GLYPHSET對象指針,目的是将字庫中的字元資訊儲存在此對象中,以便進一步處理。

示例

HDC hdc=GetDC(0);
		DWORD  size=0; 
		int i;int j;wchar_t myChar[20000]; 
		int q=0; 

		int error2 = AddFontResourceEx(_T("E:/Pro/WorkSpace/C/TestFont/TestFont/fonts/arial.ttf"), FR_PRIVATE, 0);
		
		if (!error2)
		{
			printf("字型加載失敗!");
		}

		HFONT hfont = CreateFont(20, 0, 0, 0, FW_HEAVY, 0, 0, 0, DEFAULT_CHARSET,\
			OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, _T("font_171.ttf"));
		
		HFONT oldFont =(HFONT)SelectObject(hdc,hfont);

		//第一次調用,獲得所需空間大小 
		size=GetFontUnicodeRanges(hdc,NULL);
		// 配置設定空間 
		GLYPHSET *pGlyphSet=(GLYPHSET*) new BYTE[size]; 
		pGlyphSet->cbThis=size;

		//第二次調用,獲得字庫相關資訊 
		size=GetFontUnicodeRanges(hdc,pGlyphSet); 

		for(i=0;i<pGlyphSet->cRanges;i++){ 
			for(j=0;j<pGlyphSet->ranges[i].cGlyphs;j++){ 
				myChar[q]=j+pGlyphSet->ranges[i].wcLow;//這就是包含的字元 
				q++; 
			} 
		} 
           

注意:該函數隻能識别正常有效的字型檔案

參考博文:

GetFontUnicodeRanges、GetFontUnicodeRanges

C++解析IconFont矢量字型檔案ttf,以及無鋸齒顯示矢量字型

c