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 など)に任せると、空白を持たない日本語が折り返せない
といった面ごとの差が出るため、自前で折り返さないでください。
WrapMode が None 以外のスタイルを直接 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 は、DrawText が VAlign.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 など別形式へのエクスポート