描画した図形をカーソルヒットで個別に反転するには?

解決


イナフ  2005-08-25 02:39:54  No: 124401

いつもお世話になっております。

VB.NETで複数の図形を描き,それを個別に認識させ,図形にカーソルヒットで
反転させたいのですが,方法がわかりません…。

リージョンとグラフィックパスを使用するとカーソルヒットによる反転は
可能になったのですが,リージョン一個に図形追加をしていくため
描いた図形すべてが反転されてしまいます。
カーソルヒットしている図形をリージョンから取り出し,個別に反転を行う事は
可能なのでしょうか?(リージョンを配列化し一個ずつセットするしか方法が思い浮かびません…。)
下記に長々と申し訳ありませんが,現在の一部ソースを明記します。

    Dim rgn As New Region                   'リージョン
    Dim pa0, pa1 As New GraphicsPath        'グラフィックスパス

    'グラフィックパスとリージョンセット
    Private Sub frmRegion_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize

    (省略:図形のグラフィックパス)
        'Regionにセット
        rgn.MakeEmpty()
        rgn.Union(pa0)  '矩形
        rgn.Union(pa1)  '円
        Me.Invalidate()

    End Sub

  '図形描画
    Private Sub frmRegion_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim g As Graphics = e.Graphics     'グラフィックインスタンス

    '現状は全図形が反転されるソースになっていますが,ここでカーソルヒットしている図形の反転色をセットしたい。
        With g  

            .FillPath(bPol, pa0)            '矩形描画
            .FillEllipse(bPol, rFs)         '円描画

            .DrawPath(Pens.Black, pa0)      '矩形反転
            .DrawEllipse(Pens.Black, rFs)   '円反転
        End With
    End Sub

  'カーソル移動による図形反転色セット
    Private Sub frmPath_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

        If rgn.IsVisible(e.X, e.Y) Then ←ここでどの図形がカーソルヒットしているのかを判断し,反転色をセットしたいのですが…。

            Me.Cursor = Cursors.Hand                            '図形ヒットカーソルセット
            bPol = New SolidBrush(Color.GreenYellow)            '反転色セット
            Debug.WriteLine("ON")
        Else
            Me.Cursor = Cursors.Default                         'カーソルデフォルト
            bPol = New SolidBrush(Color.FromName("Control"))    '反転色解除
            Debug.WriteLine("OFF")
        End If
        Me.Refresh()
    End Sub


特攻隊長まるるう  2005-08-25 20:49:17  No: 124402

Region クラスにプロパティが用意されてない時点で
内部の図形を個別に取り出す事は考えられていない
のではないかと思います。
内部のデータを取得できそうな Get 系のメソッドには
一通り目を通しましたが、使えそうなのは
   Region.GetRegionData.Data()
くらいです。図形を和集合として扱ってますし、この
クラスが一番小さなオブジェクトだと理解した方が
いいのでは?複数のオブジェクトを管理できるコレクションの
形になってないので、結局自分でコードを書くことに
なりそうです。

>リージョンを配列化し一個ずつセットするしか方法が思い浮かびません…。
それでいいと思います。


イナフ  2005-08-26 23:05:19  No: 124403

ご回答ありがとう御座いました。

>このクラスが一番小さなオブジェクト
なるほど,こう言って頂けると理解できました。

何か良い方法が見えてくるかも知れませんので,
とりあえずリージョンを配列化し実現してみようと
思います。


特攻隊長まるるう  2005-08-26 23:46:08  No: 124404

配列が基本だけど、図形を追加したら新しい Region を
確保してそこに図形を格納…といった処理を持った独自のクラスを
作ってもいいかも?。↓参考になればどうぞ。
[チュートリアル : 独自のコレクション クラスの作成]
http://www.microsoft.com/japan/msdn/library/ja/vbcon/html/vaconCreatingYourOwnCollectionClass.asp
[SortedList クラス]
http://www.microsoft.com/japan/msdn/library/ja/cpref/html/frlrfsystemcollectionssortedlistclasstopic.asp


イナフ  2005-08-31 04:37:59  No: 124405

頂いた参考資料を元に独自コレクションを作成できました。

本当に助かり,勉強になりました。
もっとMSDNを有用に活用できるように努力します。

ありがとう御座いました。


イナフ  2005-08-31 04:38:15  No: 124406

解決しました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加