CTreeCtrl オブジェクトの TVN_SELCHANGED に関する問題
-
01-07-2019 - |
質問
CTreeCtrl MFC クラスを使用してツリー コントロール オブジェクトを作成しました。ツリー コントロールは名前の変更をサポートする必要があります。ツリー内の項目のいずれかを左クリックすると、TVN_SELCHANGED イベントが呼び出され、以下のようにツリーの選択された項目を取得できます。HTREEITEM h = m_moveListTree.GetSelectedItem();CString s = m_moveListTree.GetItemText(h);
ただし、ツリー内の項目を右クリックしても TVN_SELCHANGED イベントが発生しないため、選択した項目は左クリックイベントからそのまま残ります。これにより、次の問題が発生します。1)アイテムAのユーザーLeftClicks 2)ユーザーはアイテムBを右クリックし、名前を表示します3)選択されたアイテムはまだアイテムAに応募しているため、選択されたアイテムはまだAです。
問題解決にご協力ください。
-プラヴィーン
解決
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_NOTIFY, NM_RCLICK メッセージ。
他のヒント
この動作は仕様によるもので、右クリックしても選択範囲は移動しません。
必要に応じて、ツリー ビューで TVS_EDITLABELS スタイルをオンにします。次に、TVN_BEGINLABELEDIT 通知と TVN_ENDLABELEDIT 通知を処理します。
コンテキスト メニューをどのようにポップアップするかはわかりませんが、HitTest() を使用してポイントからツリー項目に移動できます。したがって、これを右クリック ハンドラーで使用できます。
コンテキスト メニューは、最新の合理的なキーボードのキーによってもアクティブ化できることを忘れないでください。次に、選択した項目をターゲットとして使用することになるでしょう。