- PR -

VB.NETのTreeView使用時MouseHoverイベントについて

投稿者投稿内容
ぶち
常連さん
会議室デビュー日: 2006/02/15
投稿数: 29
投稿日時: 2006-02-15 11:02
いつも参考にさせていただいてます。
自ら投稿するのは始めてですが、過去ログを探してもみつからなかったので
投稿することにしました。

環境は以下のとおりです。
・VB.NET
・Windowsアプリケーション

実現したいことは以下のとおりです。
・エクスプローラの左側のように階層的にデータを表示する
・エクスプローラのファイルやディレクトリコピーのようにドラッグ&ドロップでデータを移動する
・階層的の表示されているデータをマウスオーバーするとそのデータに関する情報が表示される

実現したいことの一番目と二番目はTreeViewを使用して実現できたのですが、
三番目の実現方法がわかりません。

MouseHoverを使用してもTreeViewの上という情報は取得できるのですが、
どのノードの上という情報が取得する方法がわかりません。

そもそもエクスプローラの左側ではマウスオーバー時にメッセージは表示されないので
もしかしてTreeViewを使用してはできないのかなとも思っています。

知りたいことは以下のとおりです。
・TreeViewを使用して実現したいことの三番目は本当に実現できるのか?
・できるのであればその方法
・できないのであれば、実現したいことのすべてを実現する方法があるのか?

以上です。

わかりにくい説明かと思いますが、よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-15 11:10
引用:

ぶちさんの書き込み (2006-02-15 11:02) より:

MouseHoverを使用してもTreeViewの上という情報は取得できるのですが、
どのノードの上という情報が取得する方法がわかりません。


GetNodeAt メソッドを使用してください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-15 11:12
実際に試したわけではないので、可能かどうかはわかりませんが。
TreeViewコントロールにはGetNodeAtという座標からノードを割り出すメソッドがあるようです。
MouseHoverイベント内でマウス座標を取得し、GetNodeAtで割り出すとうまくいきそうな気がします。
ただし、座標はデスクトップを基準としているものか、ウィンドウを基準としているものか、コントロール基準かによって変わってくるのでご注意を。
_________________
by うちうせん
ぶち
常連さん
会議室デビュー日: 2006/02/15
投稿数: 29
投稿日時: 2006-02-15 11:22
しゅうさん、じゃんぬねっとさんすばやい返信ありがとうございます。

GetNodeAtメソッドのパラメータに座標を渡さなくてはいけないですが、
MouseHoverイベントでわたされるEventArgs型の引数から座標を取得する方法が
わかりません。

基本的な質問で申し訳ありませんがよろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-15 11:49
引用:

ぶちさんの書き込み (2006-02-15 11:22) より:

GetNodeAtメソッドのパラメータに座標を渡さなくてはいけないですが、
MouseHoverイベントでわたされるEventArgs型の引数から座標を取得する方法がわかりません。


イベント引数に拘る必要はないですね。
ヒントは、System.Windows.Forms.Cursor クラス。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
うちうせん
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 96
お住まい・勤務地: 福岡県
投稿日時: 2006-02-15 11:53
引用:

GetNodeAtメソッドのパラメータに座標を渡さなくてはいけないですが、
MouseHoverイベントでわたされるEventArgs型の引数から座標を取得する方法が
わかりません。


MouseHoverイベント内で座標をとるためには、TreeViewのMousePositionプロパティを参照してください。ただし、画面座標なのでGetNodeAtで使うためにはTreeViewのPointToClientメソッドで座標変換します。

一つ思ったのですが、MouseHoverイベントにするとTreeViewコントロール上にマウスが乗った瞬間1度しかイベントが起きません。なので乗った瞬間にノード上でなければ取得できないようです。
この場合は、MouseMoveイベントを使う方がいいのでは?と思います。
MouseMoveイベントだとeから座標も取得できます。
マウスボタンを押しているかどうかもeから取得できるので、その辺で条件分岐させる必要はありますが。

_________________
☆☆☆☆☆☆☆☆☆☆☆☆☆☆
       しゅう
☆☆☆☆☆☆☆☆☆☆☆☆☆☆

[ メッセージ編集済み 編集者: しゅう 編集日時 2006-02-15 11:55 ]

[ メッセージ編集済み 編集者: しゅう 編集日時 2006-02-15 11:58 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-15 12:07
検索してみたら、あった... orz
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5674&forum=7

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぶち
常連さん
会議室デビュー日: 2006/02/15
投稿数: 29
投稿日時: 2006-02-15 16:33
じゃんぬねっとさん しゅうさん何度もありがとうございます。

しゅうさんのおっしゃるとおりMouseHoverではイベントが一度しかとれなかったので
悩んでいたとこでした。ありがとうございます。

じゃんぬねっとさん、過去ログ探していただいてすみません。
そのとおりだとなかなかうまくいかなくて少し悩んでいました。

デバッグで進めるとToolTip.ActiveをTrueにするところを通っているのですが、
実際にToolTipが表示されなくて悩んでいました。

参考のソースだとToolTip.ActiveをFalseにしてから
SetToolTip()とToolTip.ActiveをTrueにしてましたが、
ToolTip.ActiveをTrueにする場合はToolTip.ActiveをFalseにする
ルートを通らないようにし
ToolTipを表示しない場合のみToolTip.ActiveをFalseに設定するように
しました。

例とは異なるので少し不安ですが、とりあえずうまくいきました。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)