2010-08-21 63 views
1

我已經下載了一個字體,[Betsy Flanagan] [1],我希望在我的程序中使用它顯示各種程序中的屏幕鍵盤快捷鍵及其含義。如何在.NET程序中使用.TTF字體「不是truetype字體」?

但是,在Visual Studio 2010中爲標籤選擇字體時,會出現一條錯誤消息,指出「僅支持TrueType字體,這不是TrueType字體」。

有什麼辦法讓我在.NET程序中顯示帶有這種字體的文本?由於這是一種專門的烤麪包形式,只有一個標籤需要使用這種特殊字體,所以我並不在意它是否可以做到這一點(如P/Invoke或類似的)。

注意:這是一個.NET 4.0 Winforms應用程序。

+0

WPF?的WinForms? ASP.NET?你可以使用位圖嗎? – Niki 2010-08-21 15:41:36

+0

WinForms,這意味着我必須以某種方式渲染所有的字體位圖。不是我想要的解決方案,但如果這是實現它的唯一方法,我可能會研究它。 – 2010-08-21 15:45:41

+0

嘗試通過一些TTF轉換程序運行它以使其可用。 – 2010-08-21 16:09:40

回答

2

如果this is the font you're trying to use,那麼你的本地實例是否已損壞?

當我嘗試將標籤和其他winforms控件設置爲Betsy時,VS2010表現良好。下載我鏈接的一個,看看是否有效。我的看法是,如果你已經安裝了有效的TTF,VS是不會例外的。

1

看一看這段代碼加載嵌入字體作爲一種資源,並控制在適用時,樣品展示中嵌入OCR字體

private PrivateFontCollection pfc = new PrivateFontCollection(); 
    private Font _fntOCRFont = null; 
    private enum FontEnum{ 
     OCR = 0 
    }; 

    private FontSize _fntSizeDefault = FontSize.Small; 
    private float _fFontSize = 0.0F; 

    private void InitOCRFont(){ 
     try{ 
      System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("ocraext.ttf"); 
      if (streamFont != null){ 
       byte[] fontData = new byte[streamFont.Length]; 
       streamFont.Read(fontData, 0, (int)streamFont.Length); 
       streamFont.Close(); 
       unsafe{ 
        fixed(byte *pFontData = fontData){ 
        this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length); 
       } 
      } 
     }else{ 
      throw new Exception("Error! Could not read built-in Font."); 
     } 
    }catch(Exception eX){ 
     throw new Exception("Exception was: " + eX.Message); 
    } 
} 

private void ConvertFontEnumToFloat(){ 
    switch(this._fntSizeDefault){ 
     case FontSize.Small : 
      this._fFontSize = 8.0F; 
      break; 
     case FontSize.Medium : 
      this._fFontSize = 10.0F; 
      break; 
     case FontSize.Large : 
      this._fFontSize = 12.0F; 
      break; 
    } 
} 

代碼的典型調用會是這樣的用法像這樣:

this.ConvertFontEnumToFloat(); 
this._fntOCRFont = new Font(this.pfc.Families[(int)FontEnum.OCR], this._fFontSize, System.Drawing.FontStyle.Bold); 
if (this._fntOCRFont != null){ 
    // Do something here... perhaps assign it to a control 
} 

功能InitOCRFont使用不安全的,這意味着具有unsafe編譯選項接通,從嵌入式資源和載荷成PrivateFontCollection讀取。函數ConvertFontEnumToFloat使用硬編碼的浮點值來指示基於字體枚舉的大小。完成代碼後,請務必在指定類的Dispose方法中處理PrivateFontCollection實例。