DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンテキストメニューを閉じるイベント?

環境/言語:[WindowsXP VS2003 C#]
分類:[.NET]

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

Windowsのエクスプローラのようなものを作ろうとしていて、
ツリービュー上のノードを右クリックした際に、コンテキスト
メニューを表示するようにしています。
この時、右クリックされた対象ノードのテキストを反転表示さ
せる(SelectedNodeにはしない)ようにしたいと思っています。

ここで、右クリックしたときにテキストを反転させることはで
きる(ForeColorとBackColorの変更)のですが、コンテキスト
メニューに Closeイベントがないため、元に戻すタイミングが
つかめず困っています。

コンテキストメニューを閉じるイベントを取る方法はあるので
しょうか。
または、反転表示させる方法が、そもそも間違っているので
しょうか。

よろしくお願いいたします。
■No7714に返信(ぱるさんの記事)
> コンテキストメニューに Closeイベントがないため、
> 元に戻すタイミングがつかめず困っています。
> コンテキストメニューを閉じるイベントを取る方法はあるのでしょうか。

そんなイベントは必要ないかと思われます。
普通にやってれば、Show()メソッド後に元に戻せば良いはずですから。

Private Sub TreeView1_MouseUp(略
    If e.Button = MouseButtons.Right Then
        If TreeView1.SelectedNode Is Nothing = False Then
            Me.ContextMenu1.Show(Me.TreeView1, New Point(e.X, e.Y))
            '/ TODO : ココに元に戻す処理を追加
        End If
    End If
End Sub


> または、反転表示させる方法が、そもそも間違っているのでしょうか。

そもそも、カレントノードを移した方が平和に済みそうなのですが。

Private Sub TreeView1_MouseDown(ry
    TreeView1.SelectedNode = TreeView1.GetNodeAt(e.X, e.Y)
End Sub
java.lang.Nullpoさん、ご返答ありがとうございます。

> そんなイベントは必要ないかと思われます。
> 普通にやってれば、Show()メソッド後に元に戻せば良いはずですから。
>
> Private Sub TreeView1_MouseUp(略
> If e.Button = MouseButtons.Right Then
> If TreeView1.SelectedNode Is Nothing = False Then
> Me.ContextMenu1.Show(Me.TreeView1, New Point(e.X, e.Y))
> '/ TODO : ココに元に戻す処理を追加
> End If
> End If
> End Sub

この方法ですと、コンテキストメニューが表示されている間、反転(強調)表示
させることが出来ません。

> そもそも、カレントノードを移した方が平和に済みそうなのですが。

java.lang.Nullpoさんがおっしゃることはもっともなのですが、今回行
いたいこととして、Windowsのエクスプローラのように、右クリックした
ノード(SelectedNodeではない)のテキストを、コンテキストメニュー
が表示されている間、反転(強調)表示させたいのです。

(せっかくご回答いただいたのに申し訳ありません)
■No7716に返信(ぱるさんの記事)
> java.lang.Nullpoさん、ご返答ありがとうございます。
> この方法ですと、コンテキストメニューが表示されている間、反転(強調)表示
> させることが出来ません。
> java.lang.Nullpoさんがおっしゃることはもっともなのですが、今回行
> いたいこととして、Windowsのエクスプローラのように、右クリックした
> ノード(SelectedNodeではない)のテキストを、コンテキストメニュー
> が表示されている間、反転(強調)表示させたいのです。

組み合わせて考えて欲しかったかな・・・。orz

Private Sub TreeView1_MouseUp(略
    Dim hNode As TreeNode

    If e.Button = MouseButtons.Right Then
        hNode = TreeView1.GetNodeAt(e.X, e.Y)

        If hNode Is Nothing = False Then
            hNode.BackColor = Color.FromName("ActiveCaption")
            Me.ContextMenu1.Show(Me.TreeView1, New Point(e.X, e.Y))
            hNode.BackColor = Color.FromName("Window")
        End If
    End If
End Sub
java.lang.Nullpoさん、ご返答ありがとうございます。

■No7717に返信(java.lang.Nullpoさんの記事)
>
> 組み合わせて考えて欲しかったかな・・・。orz
>
> Private Sub TreeView1_MouseUp(略
> Dim hNode As TreeNode
>
> If e.Button = MouseButtons.Right Then
> hNode = TreeView1.GetNodeAt(e.X, e.Y)
>
> If hNode Is Nothing = False Then
> hNode.BackColor = Color.FromName("ActiveCaption")
> Me.ContextMenu1.Show(Me.TreeView1, New Point(e.X, e.Y))
> hNode.BackColor = Color.FromName("Window")
> End If
> End If
> End Sub

解決しました。大変失礼しました!
コンテキストメニューの Showメソッドの動きを完全に誤解していました。
MSDNライブラリに載っていた、Showメソッドについての記述、
「このメソッドはメニュー表示が消されるまで返されません。」
の意味が理解できました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板