VB.NET2005 TIPS / グラフィックス系 |
G0202 領域の認識 |
最終更新:2006/11/12 再掲 |
●解説
領域とは閉じた図形のこと。認識とは指定の点がその図形の内か外かを判定すること。ユーザに、より正確かつグラフィカルに選択させる場合などに必須な処理となる。
星形、文字列の内外を認識している例
●原理
Regionオブジェクトを利用する。Regionは通常パスから生成できる。パスはGraphicsで扱う図形や文字列が対象となっている。RegionのメソッドIsVisible(point())にて指定の点の内外判定ができる。
領域が単純な矩形であれば、Region を使うまでもなく、Contains
メソッドで判別できる。
Dim Rec As RectangleF
(Rectangleでも可)
If Rec.Contains(X, Y ) Then
・・・・・・・・
などとすれば点(X, Y) が、Recの内外かの判定ができる。
●方法
-
図形、文字などのパスを生成
-
そのパスをRegionに加える。一つのRegionに複数のパスを含められる。
-
RegionのメソッドIsVisible(point())にて指定の点の内外判定を行う。
●実例
Formモジュールで、
Dim pa2, pa3 As New GraphicsPath()
Dim rgn As New Region
Dim Star As PointF() = {New PointF(), New PointF() ・・・・・・・・}
'適当なポリゴン
・・・・・・・・・・・・・・・・・・・・・・・
pa2.Reset()
pa2.StartFigure()
pa2.AddPolygon(Star)
pa2.CloseFigure()
Dim fmt As New StringFormat()
fmt.Alignment = StringAlignment.Center
fmt.LineAlignment = StringAlignment.Center
pa3.Reset()
pa3.AddString(s1, New FontFamily("MS Pゴシック"), CInt(FontStyle.Bold), (文字サイズ),
(開始位置), fmt)
pa3.CloseFigure()
rgn.MakeEmpty()
rgn.Union(pa2)
'pa2を単純にrgnに加える
rgn.Union(pa3)
'pa3を単純にrgnに加える
Dim g As Graphics = XXXXXXXXX
Dim p As Pen = New Pen(Color.Red, 2)
g.FillPath(Brushes.Blue, pa2) 'このままだとユーザにRegionが見えないので、Regionを含ませたいオブジェクトに描画して置く
g.FillPath(Brushes.Red, pa3)
p.Dispose()
・・・・・・・・・・・・・・・・ これで準備完了
オブジェクトXXXXXXXXXのマウスイベントにて、例えば、
Private Sub
XXXXXXXXX_MouseMove(・・・・・・, e As System.Windows.Forms.MouseEventArgs) Handles
MyBase.MouseMove
If
rgn.IsVisible(e.X, e.Y) Then
'MousePositionはスクリーン座標なので使えない、eのアーギュメントを使う
Me.Cursor = Cursors.Hand 'マウスポインタは内側
・・・・・・・・・・
Else
Me.Cursor = Cursors.Default
'マススポインタは外側
・・・・・・・・・・
End If
End Sub
などとする。
|