Top / Programming / C++Builder / ツリービューのヒントをカスタマイズする

ツリービューのヒントをカスタマイズする

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

更新履歴