2

マシンにWindowsコアフォントの1つがインストールされていないユーザー(Courier New、Comic Sans MS、Arialなど)が何度も問題に遭遇しました。これらのいずれかを作成しようとすると、関連するフォントや実際には他のフォントにフォールバックするのではなく、エラーがスローされます。

フォントをCourierにしたいのですが、特にそれに夢中になっているわけではない場合、フォントを作成するための最良の方法は何ですか?

4

3 に答える 3

3

フォントをリソースとして埋め込み、unsafeキーワードを使用して (「unsafe」でコンパイルする必要があります)、フォントを取得できます... ユーザー コントロールを「OCR」タイプのフォントに設定するために使用したコード例を次に示します。

プライベート PrivateFontCollection pfc = new PrivateFontCollection();
プライベート フォント _fntOCRFont = null;
プライベート列挙型 FontEnum{
   OCR = 0
};

これはフォントのプライベートコレクションを宣言します...フォント「OCR」は、「foo」が名前空間である命名規則を使用してリソースとして埋め込まれているため、リソース名は「foo.ocraext.ttf」になります...見てくださいフォントをロードしてコレクションに追加する「InitOCRFont」:

プライベート ボイド InitOCRFont(){
   試す{
      System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf");
      if (streamFont != null){
          byte[] fontData = new byte[streamFont.Length];
          streamFont.Read(fontData, 0, (int)streamFont.Length);
          streamFont.Close();
          安全でない{
                fixed(byte *pFontData = fontData){
                   this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length);
                }
          }
      }そうしないと{
          throw new Exception("エラー! 組み込みフォントを読み取れませんでした。");
      }
   }catch(Exception eX){
      throw new Exception("InitOCRFont メソッド - 例外が発生しました!\n例外は: " + eX.Message);
   }
}

ここでは、ユーザー コントロール内のコントロールを設定して、コレクションを反復処理することにより、フォントをその「OCR」フォントに設定します。「InitializeCtlFont」を参照してください。フォント サイズは 10 で、太字の「書体」です。

プライベートボイド InitializeCtlFont(){
    this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
    if (this._fntOCRFont != null){
         foreach(this.Controls のコントロール ctl){
            if (ctl != null && ((ctl はラベル) || (ctl は TextBox))){
                        ctl.Font = this._fntOCRFont;
                    }
         }
    }
}

Disposeユーザー コントロールが破棄されたら、次のメソッドで示されているように、フォントが占有しているリソースを解放することが不可欠です。

試す{
   if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}キャッチ{
}
試す{
   if (this.pfc != null) this.pfc.Dispose();
}キャッチ{
}

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-03-06T13:52:35.990 に答える
2

特にCourierの代わりに、MonospaceフォントFontFamily.GenericMonospaceを取得するために使用できます。

Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);

このような一般的なフォントファミリもいくつかあります。

好みのフォントを試し、例外が発生した後の最後の手段としてこれを使用することもできます。

于 2010-03-06T13:35:43.680 に答える
2

これは非常に珍しいことです。プログラムがターゲット マシンで使用できないフォントを要求した場合、Windows フォント マッパーは常に代替フォントを提供します。その代替フォントは通常、XP では Microsoft Sans Serif、それ以降のバージョンでは Segoe UI になります。どちらも問題を引き起こすことはありません。

繰り返しになりますが、マシンがめちゃくちゃになってコア フォントが利用できない場合は、TrueType フォントがまったく利用できない可能性があります。はい、それはあなたのプログラムを爆撃します。率直に言って、これは本当に貴重な顧客でない限り、対処する必要はありません。それ以外の場合は、顧客のサポート チームによって簡単に解決されます。

于 2010-03-06T14:52:00.070 に答える