VB.NET2005 TIPS / グラフィックス系 |
M0301 文字の線形変換 |
最終更新:2006/11/12 旧版統合 |
●解説
ここでの線形変換は、平行移動、拡大・縮小、回転を言う。これを文字(列)に適用する例を紹介する。
横67%、縦122%にし、23度回転の結果。領域の中心になるよう調整されている。
●原理
グラフィックスのMatrix
オブジェクトにて線形変換を適用し、そこで文字列を描画する。すべて、一度で処理できる。但し、平行移動は、あまり意味がないのでここでは省く。
●方法
拡大・縮小(Scale)と回転'(Rotate)をMatrix に適用する。
Dim pmx As New Matrix()
pmx.XXXXX
pmx.YYYYY(・・・・・, Drawing2D.MatrixOrder.Append)
XXXXX、YYYYY はメソッドとすれば、Append すれば、二つのメソッドがその順に適用される。
●実例
ピクチャボックス(picL)に文字列を描画する例
文字の縦、横と回転角度を外部から与え、描画する。
updW、updH、updR は、それぞれ、幅比率(%)、高比率(%)、回転角度(度)を指定する、アップダウンコントロール
picL のペイントイベントにて、
Dim g As Graphics = e.Graphics
Dim W, H, nw, nh As Single
W = picL.Width
H = picL.Height
Xp = W / 2
Yp = H / 2
nw = updW.Value / 100
'横比
nh = updH.Value / 100
'縦比
Dim cmx As Matrix = g.Transform
'現在のマトリックスを保存
Dim pmx As New Matrix()
'新しい空のマトリックスを生成
Dim rp As New PointF(Xp, Yp)
'とりあえず、領域の中心
Dim fmt As New StringFormat()
fmt.Alignment = StringAlignment.Center
fmt.LineAlignment = StringAlignment.Center
Dim b As New SolidBrush(Color.DarkBlue)
g.ResetTransform()
'現在のグラフィックスをリセット
pmx.Scale(nw, nh)
'先ず、縦横比を適用
pmx.RotateAt(CR, rp, Drawing2D.MatrixOrder.Append)
'点rp で回転させる
g.Transform = pmx
'新しいマトリックスを適用
Dim ff As New FontStyle()
Dim f As Font = New Font(fn, fSZ, ff)
If chkR.Checked Then
'文字列を常に領域の中心で
g.DrawString(Str, f, b, Xp / nw, Yp / nh, fmt)
Else
'新しい座標に沿って
g.DrawString(Str, f, b, Xp, Yp, fmt)
End If
pmx.Dispose()
g.Transform = cmx
'マトリックスを元に戻しておく
f.Dispose()
b.Dispose()
fmt.Dispose()
何もしないでそのまま適用すると、文字列は拡大・縮小に伴い移動し、また回転中心は常に一定となる(回転中心座標(rp)は、座標変換されなく元の領域の中心のままなので)。文字列の場合は、一定の場所で処理したいので、chkR
なるチェックボックスで、"領域の中心で処理"を指定できるようになっている。この指定で、文字列は、新しい座標系で、表示上は元の領域の中心で描画される。
|