画面・グラフィック


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" );
		}

	}
}
		
	



inserted by FC2 system