Winフォーム
WinForms を使用する場合、適切なタイプ設定を行うことはほとんど不可能であり、ほとんどすべてを手動で行う必要があります。これにはいくつかの理由があります。
- 詳細なグリフ情報が得られない
- テキストの測定は、GDI+ と GDI ベースのバージョンの両方で、ひどく不正確です。
Windows プレゼンテーション ファンデーション
WPF を使用する場合、各グリフに関する詳細な幾何学的情報を取得するため、これはまったく別の問題です。
ただし、この 2 つをインターリーブすることはできます。少し面倒ですが、可能です。ただし、グラフィックとビットマップを直接交換できないため、パフォーマンスが低下する可能性があるため、お勧めしません。
可能性を調べたい場合はSystem.Windows.Media
、プロジェクトに をインポートして、WPF の書体とグリフ機能にアクセスする必要があります。
他にもいくつかの課題があります。
- WinForm と WPF の間のフォント リストは同じではありません (WPF ではフォントとフォントの種類が増えます)。
- WPF グリフをそのまま使用して WinForm ビットマップに描画することはできません。
- 予想通り、グリフからの値は in で
em
あるため、ポイント サイズに基づいてピクセルに変換する必要があります。
ただし、次の (これに限定されない) 情報を取得できます。
すべての詳細 (ここにリストするには多すぎます):
http://msdn.microsoft.com/en-us/library/system.windows.media.glyphtypeface.aspx
結論
しかし、GDI+ と WinForms を使い続けるなら、おそらく GDI ベースのTextMetricsクラスを使用するのが最善の方法です。
いずれにせよ、パディングの問題が発生する可能性があり、文字間隔などを設定できません。
top + ascent を使用して、各書体とサイズのベースラインを計算する必要があります。
FontFamily ff = myFont.FontFamily;
float lineSpace = ff.GetLineSpacing(myFont.Style);
float ascent = ff.GetCellAscent(myFont.Style);
float baseline = myFont.GetHeight(ev.Graphics) * ascent / lineSpace;
PointF renderPt = new PointF(pt.X, pt.Y - baseline));
ev.Graphics.DrawString("My baselined text", myFont, textBrush, renderPt);
WinForm 環境内でこれを実行できるサードパーティのライブラリを知りません。ここで述べた理由とそれが引き起こす苦痛のためだと思います。
結論として、適切なタイプ設定を実現するためのより良い基盤として、Windows Presentation Foundation/WPF を参照することをお勧めします。これは、WinForms を使用して多くの妥協に行き詰まるからです (フォント ビューアーを作成しました。ブラックボックスなどを含むグリフとそれに関する詳細情報を表示したかったので、WPFに出くわしました-それは十分に苦痛でした)。
アップデート:
植字エンジンとしての WebBrowser
これを回避するには、WebBrowser コントロールを使用して設定を行います。これは実際のハッキングではありませんが、ユーザーのコンピューターの IE ブラウザーに最初は不要な依存関係を確立するため、少しハックっぽいです。
ただし、HTML ページと同じようにテキストを簡単に制御できるため、タイプの設定に関しては柔軟に対応できます。
結果を得るには、テキストのスタイルと属性を含む HTML を添付します。画像などと組み合わせることもできます (当然)。
コントロールは、たとえば、ユーザーには表示されない別の非表示のフォームに配置できます。
フォームに WebControl をドロップするか、手動で作成した後、HTML を 1 つのステップで設定します。
WebBrowser1.DocumentText = "<span style='font-size:24px;'>Type-setting</span> <span style='font-family:sans-serif;font-size:18px;font-style:italic;'>using the browser component.</span>";
次のステップは、HTML としてレンダリングしたものを画像として取得することです。これは次のように実行できます。
using mshtml;
using System.Drawing;
using System.Runtime.InteropServices;
[ComImport, InterfaceType((short)1), Guid("3050F669-98B5-11CF-BB82-00AA00BDCE0B")]
private interface IHTMLElementRenderFixed
{
void DrawToDC(IntPtr hdc);
void SetDocumentPrinter(string bstrPrinterName, IntPtr hdc);
}
public Bitmap GetImage(string id)
{
HtmlElement e = webBrowser1.Document.GetElementById(id);
IHTMLImgElement img = (IHTMLImgElement)e.DomElement;
IHTMLElementRenderFixed render = (IHTMLElementRenderFixed)img;
Bitmap bmp = new Bitmap(e.OffsetRectangle.Width, e.OffsetRectangle.Height);
Graphics g = Graphics.FromImage(bmp);
IntPtr hdc = g.GetHdc();
render.DrawToDC(hdc);
g.ReleaseHdc(hdc);
return bmp;
}
From: WebBrowser コントロールからの画像の保存
これで、ビットマップを通常のページに配置できます。..または、対話機能を減らしたフォーム上でコントロールを直接使用します (そうでない場合、右クリック メニューは簡単に問題になる可能性があります)。
正確な使用方法がわからない場合、これは適切なソリューションである場合とそうでない場合がありますが、いくつかの強力なオプションが提供され、サードパーティのソリューションの代わりになる可能性があります。
コンポーネント
高低を見ると、この領域はあまりターゲットにされていないように見えます。近いものを 1 つ見つけることができましたが、パターンは続きます。1 つはハンマーで釘を打ちます。WebBrowser の回避策と同じカテゴリになります。
このコンポーネントは実際には本格的なエディターですが、ほとんどを無効にすることで、書式設定されたテキスト/グラフィックをタイプ設定の種類とともに表示するために使用できる可能性があります。
http://www.textcontrol.com/en_US/products/dotnet/overview/
もう 1 つの可能性は、PDF コンポーネントを使用してコンテンツを設定し、コンポーネントを使用して PDF をグラフィック (商用) としてレンダリングすることです:
http://www.dynamicpdf.com/Generate-PDF-.NET.aspx
http://www .dynamicpdf.com/Rasterizer-PDF-.NET.aspx
非営利:
http://www.pdfsharp.net/?AspxAutoDetectCookieSupport=1
GhostScript を使用して画像を取得する:
http://www.codeproject.com/Articles/32274/How-To-Convert-PDF-to-Image-Using-Ghostscript-API
明らかな静的な代替手段
..おそらくコルキーですが、いずれにせよ、シンプルさが最適な場合があるため、それを含めます-
これらのページを動的に作成する必要がない場合は、すべてのテキストとグラフィックを Illustrator/Photoshop/inDesign などで生成し、結果を画像として保存して表示します。