8

ページにテキストをレイアウトする必要がある WinForms .NET プログラムを作成しています (いくつかの基本的な幾何学的/ベクトル グラフィックを使用)。OS X のCore GraphicsCore Textに相当するものはありますか? これまでのところ、ページにテキストを描画するために とによって提供されるオブジェクトPrintDocumentを使用しているだけですが、単語間のスペースや行間のスペースなどをほとんど制御できず、多くのことを手動で行う必要があります。GraphicsPrintPageEventArgs

何かが足りない気がします。ページにテキストをタイプセットするためのより良い方法はありますか? 個人的な使用が無料である限り、サードパーティのソリューションを使用してもかまいません。

これは、1 ページのパンフレット/チラシ (ほとんどのテキストは可変ですが、画像は静的)、賞状 (ほとんどのテキストと画像は静的ですが、一部のテキストは可変)、タイムテーブル、等

4

2 に答える 2

19

Winフォーム

WinForms を使用する場合、適切なタイプ設定を行うことはほとんど不可能であり、ほとんどすべてを手動で行う必要があります。これにはいくつかの理由があります。

  1. 詳細なグリフ情報が得られない
  2. テキストの測定は、GDI+ と GDI ベースのバージョンの両方で、ひどく不正確です。

Windows プレゼンテーション ファンデーション

WPF を使用する場合、各グリフに関する詳細な幾何学的情報を取得するため、これはまったく別の問題です。

ただし、この 2 つをインターリーブすることはできます。少し面倒ですが、可能です。ただし、グラフィックとビットマップを直接交換できないため、パフォーマンスが低下する可能性があるため、お勧めしません。

可能性を調べたい場合はSystem.Windows.Media、プロジェクトに をインポートして、WPF の書体とグリフ機能にアクセスする必要があります。

他にもいくつかの課題があります。

  1. WinForm と WPF の間のフォント リストは同じではありません (WPF ではフォントとフォントの種類が増えます)。
  2. WPF グリフをそのまま使用して WinForm ビットマップに描画することはできません。
  3. 予想通り、グリフからの値は 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 などで生成し、結果を画像として保存して表示します。

于 2013-07-10T00:27:43.103 に答える
0

テキストを配置するには: いくつかの可能性があります:

  1. シンプルなテキスト操作 (フォント、配置、色など) を可能にするシンプルなラベル。
  2. 必要に応じてコントロールのプロパティを変更できるリッチ テキスト ドキュメントです。このドキュメントには単純な画像などが表示される場合があることに注意してください。
  3. 画像 -> グラフィックス オブジェクトと onpaint イベントを使用して動的に作成できる画像。これは非常に低レベルのアプローチであるため、お勧めしませんが、低レベルになればなるほど、より多くのパワーが得られます。
  4. 作成したカスタムコントロールで、ローカルメンバーに描画/書き込みたい情報を保持する多くのコントロールの組み合わせ->何かを変更したときに継続し、フラグを設定し( _needToBeRepainted = true;)、​​次に再描画する場合(_needToBeRepaint) すべてを描画します。

この問題を解決するためにさらに支援が必要な場合はお知らせください。

于 2013-07-09T12:49:55.003 に答える