画面・グラフィック
- ツリービューのツールチップについて
TreeViewコントロールにてあるノードをポイントした時にノードごとに違うツールチップを表示したい時があります。この時、ToolTipクラスのオブジェクトをTreeViewに関連付ける必要があります。 しかも、あれやこれやと問題がありToolTipオブジェクトをフィールド変数で宣言しないといけなかったり、マウスの位置によって表示/非表示を判断しなければならなかったりとなにかと面倒です。そもそも、何でTreeViewの基本クラスであるControlクラスにToolTipの情報を持たせないんでしょう。ただノードごとのツールチップを表示するだけで結構苦労しました。
public partial class FormNodeToolTip : Form
{
public FormNodeToolTip()
{
InitializeComponent();
}
private ToolTip _toolTip;
private void FormNodeToolTip_Load( object sender, EventArgs e )
{
treeView1.ShowNodeToolTips = true;
treeView1.MouseMove += new MouseEventHandler( treeView1_MouseMove );
// わざわざフィールド変数にする必要がある。
_toolTip = new ToolTip();
// これを書かないとツールチップが5秒で消えてしまう。
_toolTip.AutoPopDelay = 32767;
// 適当なテキストを登録しないとAutoPopDelayが反映されない。
// でもこれを書くとノード以外をポイントしたときに「View」というツールチップが表示される。
_toolTip.SetToolTip( treeView1, "View" );
// ダミーデータ
for( int i = 0; i < 10; i++ )
{
TreeNode node = new TreeNode( "Sample" + i );
node.ToolTipText = "NodeToolTipText" + i;
treeView1.Nodes.Add( node );
}
}
void treeView1_MouseMove( object sender, MouseEventArgs e )
{
// ノードの無い部分(一番下のノードより下の部分)はツールチップ表示しない。
TreeNode node = treeView1.GetNodeAt( e.X, e.Y );
if( node == null )
{
_toolTip.RemoveAll();
return;
}
// ノードはあるがテキストの無い部分(ノードより右の部分)はツールチップ表示しない。
Point point = new Point( e.X, e.Y );
if( node.Bounds.Contains( point ) == false )
{
_toolTip.RemoveAll();
return;
}
// ノードにポイントした時のみ、ツールチップ登録しなおし。
// 2重に登録するとスタックオーバーフローするので登録されてないときだけ登録する。
string szIsRelated = _toolTip.GetToolTip( treeView1 );
if( string.IsNullOrEmpty( szIsRelated ) == true )
{
_toolTip.SetToolTip( treeView1, "View" );
}
}
}