2017-03-04 46 views
0

AddFontResourceEx爲每種字體返回1,但字體在GDI +中不可訪問(使用VS2015和Windows 10進行測試,也在Windows 2008 R2服務器上進行測試)。添加了AddFontResourceEx的字體在GDI中不起作用+

如果我用Windows Fonts Explorer手動安裝字體,一切正常。 看來,GDI +無法找到與AddFontResourceEx或AddFontResource添加的字體,任何想法我怎麼能得到這個工作?

我使用CodeJock庫,它使用GDI +字體來渲染XAML圖形,所以我無法控制如何創建字體。

int n = 0; 
CPathW pw; 

pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Light.ttf")); 
n =AddFontResourceEx(pw, FR_PRIVATE, nullptr); 

pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Thin.ttf")); 
AddFontResourceEx(pw, FR_PRIVATE, nullptr); 

pw.Combine(theApp.m_strMyAppFolder, _T("Roboto-Regular.ttf")); 
AddFontResourceEx(pw, FR_PRIVATE, nullptr); 

pw.Combine(theApp.m_strMyAppFolder, _T("Ubuntu-R.ttf")); 
AddFontResourceEx(pw, FR_PRIVATE, nullptr); 

pw.Combine(theApp.m_strMyAppFolder, _T("Ubuntu-L.ttf")); 
AddFontResourceEx(pw, FR_PRIVATE, nullptr); 

::SendNotifyMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); 
+0

你是否試圖在相同的過程中使用字體? _「此功能允許進程使用字體,而不允許其他進程訪問字體。」_ –

+0

是的,它是相同的進程並且沒有DLL –

+0

問題假定AddFontResourceEx()有一個錯誤。它沒有錯誤。不要忽略返回值,錯誤處理不是可選的。並且不要忽略問題出現在使用這個庫的代碼中的可能性。這些可能性在SO問題中總是非常非常高。 –

回答

2

對於GDI +你需要使用PrivateFontCollection它解決了FR_PRIVATE類似的目的,AddFontResourceEx()類。

PrivateFontCollection::AddFontFile()的文檔中已經有一個例子,所以我只是對此進行評論。

該示例將字體從Windows Fonts文件夾添加到無意義的專用字體集合,因爲這些字體無論如何都可用。 您已經從AddFontResourceEx()示例中的應用程序文件夾中加載字體,因此您可以使用PrivateFontCollection::AddFontFile()相同的程序。

要注意的另一件事是,只要應用程序正在運行,PrivateFontCollection對象應該停留在周圍,並且不應該每當想要使用這些字體繪製文本時都重新創建該對象。一個好的地方是應用程序類中的成員變量。這應該是顯而易見的,但是該示例使您看起來好像每次都必須重新創建PrivateFontCollection。這將是一個重大的表現。

編輯:

我用CodeJock庫,它使用GDI +的字體渲染XAML 圖形

PrivateFontCollection是propably不那麼容易在這種情況下使用,因爲它不」使字體在您的應用程序中全局可用,但必須用作Font的構造函數參數。但是你寫道,你不能控制CodeJock創建字體的方式。

也許CodeJock直接在XAML中支持專用字體,請參閱this example這是用於C#但也可用於CodeJock。

+0

謝謝!我曾嘗試在XAML中指定字體文件,但Codejock庫不支持此操作。好的部分是幾乎所有的codejock類都可以被覆蓋和修改,所以仍然有一些希望。那麼你是說PrivateFontCollection不會使我的應用程序全局可用的字體? –

+0

_PrivateFontCollection不會使我的應用程序全局可用的字體_ ...是正確的。你必須像這樣創建字體對象,以使用PrivateFontCollection中的字體:'Font myFont(familyName,16,FontStyleRegular,UnitPixel,&privateFontCollection)'(請參閱PrivateFontCollection :: AddFontFile文檔中的示例)。 – zett42

+0

謝謝,我將嘗試找到另一種解決方案來爲Codejock XAML TextBox創建字體。 –