- PR -

nvarcharについて

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-09 21:40
引用:

未記入さんの書き込み(2004-12-03 23:41)より:

半角/全角の問題だけではなく、プロポーショナルフォントを使用する上でもデータを印字領域に自動的に合わせこむことが必要になってくるでしょうね。OS でサポートしてくれないものかしら?


# Avalonはやってくれるのかな?
 まだ荒削りですが、サンプルということで。

 System.Windows.Forms.Labelを継承したLabelExクラスを作成します。このクラスで、OnPaintメソッドをオーバーライドします。この中のコード。
コード:
// using System.Drawing;してます
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) {
	// TODO:  LabelEx.OnPaint 実装を追加します。
	SolidBrush b = new SolidBrush(this.ForeColor);
	SizeF s = e.Graphics.MeasureString(this.Text, this.Font);
	Drawing2D.Matrix m =
		new Drawing2D.Matrix(e.ClipRectangle.Width/s.Width, 0, 0
		, e.ClipRectangle.Height/s.Height, 0, 0);
	e.Graphics.Transform = m;
	e.Graphics.DrawString(this.Text, this.Font, b, 0,0);
	e.Graphics.Transform.Reset();
	// base.OnPaint (e);
}


注目はMatrix。3列×3行の行列を作って、座標変換をします。詳細はその手の資料で。このマトリックスの倍率に、(描画領域の幅÷必要な幅)と、(描画領域の高さ÷必要な幅)を設定することで、実際に描画されるものを変形します。必要な大きさは、MeasureStringメソッドで計算します。
 本当なら、DrawStringメソッドの第4引数にRectangleを指定して、e.ClipRectangleを指定したいのですが、このレクトも変形してしまうため、座標値を指定しました。これが「荒削り」なところ。まぁ、TextAlignを指定しても、無駄なんですけど。

 度を超した変形は、とても見にくくなりますから、程々に。。。

_________________

スキルアップ/キャリアアップ(JOB@IT)