MouseMoveイベントでマウスカーソルの下にあるノードを判定して、ヒントを設定します。
ヘッダファイルにマウスカーソル下にあるノードの変更を判定するためのメンバ変数「FLastHintNode」を追加します。
「FLastHintNode」に変更がないときはヒントを更新しません。
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
TTreeView *TreeView1;
(中略)
private: // ユーザー宣言
TTreeNode* FLastHintNode; //追加
(中略)
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
OnMouseMoveイベントを記述します。
TTreeView.GetNodeAtメソッドでマウスカーソルの下にあるノードを取得します。
マウスカーソルの下にノードがないときは、何もしません。
//カーソル位置のノードに変更がなければ何もしない
TTreeNode* hoverNode = TreeView1->GetNodeAt(X, Y);
if (this->FLastHintNode == hoverNode) { return; }
ヒントを変更するために、TApplication.Cancelで、コントロール用のヒントの表示をキャンセルします。
Application->CancelHint();
TTreeView.GetHitTestInfoAtで、マウスカーソルがツリービューのどの部分に位置するかを判定します。
THitTests hitTest = TreeView1->GetHitTestInfoAt(X, Y);
if (hitTest.Contains(htOnItem) ||
hitTest.Contains(htOnIcon) ||
hitTest.Contains(htOnLabel) ||
hitTest.Contains(htOnStateIcon))
{
目的の位置にあれば、ノードを記録し、ヒントのメッセージを更新します。
this->FLastHintNode = hoverNode;
TreeView1->Hint = hoverNode->Text;
全体のソースコードは次のようになります。
void __fastcall TForm1::TreeView1MouseMove(TObject *Sender, TShiftState Shift, int X,
int Y)
{
//カーソル位置のノードに変更がなければ何もしない
TTreeNode* hoverNode = TreeView1->GetNodeAt(X, Y);
if (this->FLastHintNode == hoverNode) { return; }
Application->CancelHint();
THitTests hitTest = TreeView1->GetHitTestInfoAt(X, Y);
if (hitTest.Contains(htOnItem) ||
hitTest.Contains(htOnIcon) ||
hitTest.Contains(htOnLabel) ||
hitTest.Contains(htOnStateIcon))
{
this->FLastHintNode = hoverNode;
TreeView1->Hint = hoverNode->Text;
}
}