1

CTreeCtrl MFC クラスを使用して作成されたツリー コントロール オブジェクトがあります。ツリー コントロールは、名前の変更をサポートする必要があります。ツリーの項目のいずれかを左クリックすると、TVN_SELCHANGED イベントが呼び出され、そこから以下のようにツリーの選択項目を取得できます。CString s = m_moveListTree.GetItemText(h);

ただし、ツリー内のアイテムを右クリックしても TVN_SELCHANGED イベントが発生しないため、選択したアイテムは左クリック イベントと同じままです。これにより、次の問題が発生します: 1) ユーザーがアイテム A を左クリックする 2) ユーザーがアイテム B を右クリックして、名前を変更すると言う 3) 選択したアイテムがまだ A であるため、アイテム A に名前変更が適用されます。

問題解決にお役立てください。

-プラビーン

4

3 に答える 3

2

この動作は仕様によるものです。右クリックしても選択範囲は移動しません。

必要に応じて、ツリー ビューで TVS_EDITLABELS スタイルをオンにします。次に、TVN_BEGINLABELEDIT および TVN_ENDLABELEDIT 通知を処理します。

于 2008-09-18T07:49:12.200 に答える
0

Win32 API の上に自作の C++ GUI ライブラリのような独自の MFC を作成し、自分のコードを見てみると、この状況を処理する方法は次のとおりです。

LRESULT xTreeCtrl::onRightClick(NMHDR *)
{
  xPoint pt;

  //-- get the cursor at the time the mesage was posted
  DWORD dwPos = ::GetMessagePos();

  pt.x = GET_X_LPARAM(dwPos);
  pt.y = GET_Y_LPARAM (dwPos);

  //-- now convert to window co-ordinates
  pt.toWindow(this);

  //-- check for a hit
  HTREEITEM hItem = this->hitTest(pt);

  //-- select any item that was hit
  if ((int)hItem != -1) this->select(hItem);

  //-- leave the rest to default processing
  return 0;
}

MFC の右クリック イベントまたは右ボタン ダウン イベントで同様のことを行うと、問題が解決するのではないかと思います。

注: 上記の onRightClick コードは、WM_NOTIFYNM_RCLICKメッセージのハンドラにすぎません。

于 2008-09-18T07:46:33.440 に答える
0

コンテキスト メニューをポップアップする方法はわかりませんが、HitTest() を使用して、ポイントからツリー アイテムに移動できます。したがって、これを右クリック ハンドラで使用できます。

コンテキスト メニューは、妥当な最新のキーボードのキーでもアクティブにできることを忘れないでください。次に、おそらく選択したアイテムをターゲットとして使用したいと思うでしょう。

于 2008-09-18T07:47:25.090 に答える