V4 V5

IGridGraphics を実装すると、グリッドを任意の描画先へ出力できます。 WinForms(GDI+)・WPF・Avalonia・PDF はすべてこの 1 つのインターフェースの実装であり、 特別扱いはありません。

名前空間は unvell.ReoGrid.Core.Rendering です。

実装する

using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Rendering;

/// <summary>
/// 描画先を差し替える最小の実装。必須は 5 メソッドで、楕円・多角形・画像には
/// 既定実装があるため、必要になったときだけ上書きすればよい。
/// </summary>
public sealed class TraceGraphics : IGridGraphics
{
	public void FillRectangle(double x, double y, double w, double h, uint argb)
		=> Console.WriteLine($"fill {x},{y} {w}x{h} #{argb:x8}");

	public void DrawLine(double x1, double y1, double x2, double y2, uint argb, double width)
		=> Console.WriteLine($"line {x1},{y1} -> {x2},{y2}");

	public void DrawText(string text, double x, double y, double w, double h, uint argb, in TextStyle style)
		=> Console.WriteLine($"text \"{text}\" at {x},{y}");

	public double MeasureTextWidth(string text, in TextStyle style)
		=> text.Length * style.FontSize * 0.6;   // 実装では実際に計測する

	public void PushClip(double x, double y, double w, double h) { }

	public void PopClip() { }
}

必須メソッド

メソッド内容
FillRectangle(x, y, w, h, argb)矩形の塗り
DrawLine(x1, y1, x2, y2, argb, width)直線
DrawText(text, x, y, w, h, argb, style)テキスト1 行の描画
MeasureTextWidth(text, style)文字幅の計測
PushClip(x, y, w, h) / PopClip()クリップ領域

MeasureTextWidth は列幅の自動調整とテキストのはみ出し判定に使われます。 近似で済ませると表示が崩れます — 実際のフォントメトリクスで計測してください。

折り返しは実装しなくてよい

行分割はコア(TextLayout)が MeasureTextWidth だけを使って行い、DrawText には 改行を含まない 1 行が TextWrap.None で渡ってきます。プラットフォームの行分割 (FormattedText.MaxTextWidth など)に任せると、空白を持たない日本語が折り返せない といった面ごとの差が出るため、自前で折り返さないでください

WrapModeNone 以外のスタイルを直接 DrawText に渡す呼び出し元がある場合は、 TextLayout.DrawBlock(this, text, style, x, y, w, h, argb, style.WrapMode) に委譲すれば、 同じ位置で折り返され、禁則処理も揃います。

既定実装のあるメソッド

必要になったときだけ上書きします。

メソッド既定の動作
DrawBorderLine(...)線種を無視して DrawLine に委譲
FillEllipse(...)外接矩形を塗る
DrawEllipse(...)何もしない
FillPolygon(points, argb)外接矩形を塗る
DrawImage(image, x, y, w, h)何もしない
MeasureTextMetrics(text, style)フォントサイズから概算(ベースライン = 0.8em)
MeasureTextHeight(style)MeasureTextMetrics("Ag", style) の行高

ベースラインを揃えるには MeasureTextMetrics

書式の混ざったリッチテキストは、コアが行内で 1 本のベースラインを決め、各ランを 「そのランの ascent だけ上にずらした VAlign.Top の矩形」として渡します。したがって MeasureTextMetrics が返す Ascent は、DrawTextVAlign.Top でテキストを置く 位置と同じ基準でなければなりません(WPF / Avalonia なら FormattedText.Baseline、 GDI+ なら FontFamily.GetCellAscent)。

スタイルではなくテキストを受け取るのは、フォントフォールバックが字ごとに起きるためです。 フォントが Arial のセルに入った「合計」は Arial ではない代替フォントで描かれるので、 Arial のメトリクスで配置するとセルからはみ出します。

楕円と多角形はアイコンセットの描画に使われます。条件付き書式のアイコンを正しく出したい場合は 実装してください。

DrawImage画像 の描画に使われます。

描画する

var viewport = new GridViewport(ws);
var graphics = new TraceGraphics();

viewport.Render(graphics, viewWidth: 800, viewHeight: 600);

Render が呼び出す順序と内容はビューポートが決めます。実装側は プリミティブを受け取って描くだけで、セルの意味を知る必要はありません。

座標系

すべて論理ピクセル(96 DPI 基準)です。原点はビューの左上で、 ヘッダーやスクロール位置はビューポート側で解決済みの値が渡ります。

物理ピクセルへの変換が必要な描画先(GDI+ など)は、実装側で行ってください。

ライセンス検証

GridViewport.Render画面・印刷・PDF がすべて通る唯一の経路です。 ライセンス未適用時の透かしはここで描かれるため、独自の描画層でも同様に適用されます。

用途

  • サーバーサイドでの画像生成
  • 独自の UI フレームワークへの組み込み
  • SVG など別形式へのエクスポート

次に読む

ページの内容は役に立ちましたか?