ホーム ] TIPS ウィンドウズ系 ] TIPS グラフィックス系 ] TIPS メルチメディア系 ] TIPS 理数系 ] TIPS 総覧 ]

上へ
G0001 色名一覧
G0002 アルファブレンド
G0003 カラーマップを作る
G0101 曲線の数値化
G0102 曲線長を測る
G0103 曲線の接線・法線
G0104 曲線のスムージング
G0201 図形の回転
G0202 領域の認識
G0301 文字の線形変換
G0302 文字の自由変形
G0303 文字の極座標変換
G0304 曲線に沿った文字列
G0305 飾文字-中抜き
G0306 飾文字-縁取り
G0307 飾文字-ドロップダウンシャドウ
G0501 画像の線形変換
G0502 画像の透明化
G0503 画像の任意形状切出し
G0504 画像の回転
G0505 画像の高速処理化

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 なるチェックボックスで、"領域の中心で処理"を指定できるようになっている。この指定で、文字列は、新しい座標系で、表示上は元の領域の中心で描画される。