フォント名は同じだけど中身が異なる複数のフォントを使用するには
最近仕事ではまったので。
.Net FrameWorkで印刷イメージデータを作成してプリンターに投げる、というのを最近作ったのですが、そのときにたーくさんの外字を出力するために複数のフォントを切り替えて印刷イメージデータに出力する、というのをやりました。
このとき最もネックとなったのが、「このフォントを切り替えて出力してください」と渡されたフォントが複数あったんだけど、そのフォント名がかぶってること。
Windows外字エディタで「すべてのフォントにリンクする」を選んだときに作成される「EUDC」というフォント名で、個々のPCで外字を作成する際には多分標準。
これを制御コードが直前に付与してある文字はフォント1で、付与してない場合はフォント2で出力する必要がありました。
フォント名が同じなので、実行環境にはひとつしかインストールできず、さぁどうする?というところで結構はまった・・・
解決策はわかってみれば簡単でした。システムにインストールされたシステムフォント群(システムフォントふぁみりーというそうな)とは別に、アプリケーション固有のフォント群をインスタンスとして生成することができるので、それをまた複数生成し、それぞれに別のフォントファイルを割り当てればいけました。
超適当コード例(適当なので注意)
/* EUDC1.TTE、EUDC2.TTEの二つの外字フォントファイルがある場合。 */ void futatsunoFontdeKaiteokureyo(Graphics argGraphics) { PrivateFontCollection pfcEUDC1 = new PrivateFontCollection(); pfcEUDC1.AddFontFile("EUDC1.TTE");// フォント名はEUDC Font eudc1 = new Font(getFontFamily("EUDC", pfcEUDC1), 9); PrivateFontCollection pfcEUDC2 = new PrivateFontCollection(); pfcEUDC2.AddFontFile("EUDC2.TTE");// このフォント名もEUDCだけど、ファイルが違う Font eudc2 = new Font(getFontFamily("EUDC", pfcEUDC2), 9); Brush brush = new SolidBrush(); argGraphics.DrawString("EUDC1で表示するべき文字", eudc1, brush, 10, 10 ); argGraphics.DrawString("EUDC2で表示するべき文字", eudc2, brush, 10, 20 ); } FontFamily getFontFamily(string fontName, PrivateFontCollection pfc) { return pfcをforeachでぶん回してfontNameのフォントファミリーを返却; }
以上メモ。