DotNET でのフォントのハードコーディング
-
25-09-2019 - |
質問
ユーザーが自分のマシンに Windows Core フォント (Courier New、Comic Sans MS、Arial など) をインストールしていないという問題に何度も遭遇しました。これらのいずれかを構築しようとすると、関連するものにフォールバックするのではなく、エラーがスローされます。 どれでも 他のフォント。
フォントを Courier にしたいが、特にそれにこだわっていない場合、フォントを構築する最良の方法は何ですか?
解決
あなたはリソースとしてフォントを埋め込むとunsafe
キーワードを使用(と「危険な」でコンパイルする必要があります)フォントを取得することができます...ここでのコード例では、「私は種類のフォントにユーザーコントロールを設定するために使用していることですOCR '
private PrivateFontCollection pfc = new PrivateFontCollection(); private Font _fntOCRFont = null; private enum FontEnum{ OCR = 0 };フォントのプライベートコレクションを宣言
...フォント「OCRが」「fooは」名前空間である命名規則を使用してリソースとして埋め込まれ、それ故にリソース名は「foo.ocraext.ttf」になります。..
:フォントをロードし、コレクションに追加し、ここで「InitOCRFont」での.Lookprivate void InitOCRFont(){ try{ 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(); 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("InitOCRFont Method - Exception occurred!\nException was: " + eX.Message); } }
ここでは、私は「InitializeCtlFont」を参照して、コレクションを反復処理することにより、「OCR」のフォントことにフォントを設定するには、ユーザーコントロール内のコントロールを設定、フォントサイズは10で、大胆な「タイプフェイス」です。
private void InitializeCtlFont(){ this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold); if (this._fntOCRFont != null){ foreach(Control ctl in this.Controls){ if (ctl != null && ((ctl is Label) || (ctl is TextBox))){ ctl.Font = this._fntOCRFont; } } } }
Dispose
方法にここに示すように、は、ユーザーコントロールが配置された取得すると、それがリソースを解放することが不可欠であるフォントによって占めます:
try{ if (this._fntOCRFont != null) this._fntOCRFont.Dispose(); }catch{ } try{ if (this.pfc != null) this.pfc.Dispose(); }catch{ }
希望このことができます、 宜しくお願いします、 トムます。
他のヒント
まあ、使ってもいいでしょう FontFamily.GenericMonospace
取得するため ある 具体的には Courier ではなく等幅フォント:
Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);
がある このような汎用フォント ファミリもいくつかあります.
これは、好みのフォントを試して例外が発生した後の最後の手段として使用することもできます。
これは非常に珍しいです。あなたのプログラムがターゲットマシンでは利用できませんフォントを要求したときに、Windowsのフォントマッパーは、常に代替フォントを提供します。その代替フォントは、通常、XP上のMicrosoftサンセリフ、それ以降のバージョンでのSegoe UIになります。どちらのものと、これまでの問題を引き起こす必要があります。
マシンはそれがコアフォントが利用できていないことを台無しにされた場合は、その後、再び、それがすべてで利用可能なTrueTypeフォントを持っていないかもしれません。はい、それはあなたのプログラムを爆撃します。率直に言って、これはあなたがこれは本当に貴重な顧客である場合を除き、対処しなければならないものではありません。それはそれ以外の場合は自明顧客のサポートチームによって解決されます。