WindowsXp,VC++6.0で開発しています。
CTreeViewでツリーを表示して、ツリーのアイテムを右クリック
で選択したしたとき、以前のアイテムにフォーカスが戻ってしまいます。
左クリックならうまくいきます。
どうすればいいか教えて頂けませんか?
ツリーの属性は以下のようにしてあります。
ModifyStyle(NULL,TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT |
TVS_SINGLEEXPAND);
よろしくお願いいたします。
>CTreeViewでツリーを表示して、ツリーのアイテムを右クリック
>で選択したしたとき、以前のアイテムにフォーカスが戻ってしまいます。
私にはごく普通の動作に思えます(マウスの右ボタンクリック(というよりはボタン
ダウンか?)はキャンセルの扱いだから).... 間違った解釈でしょうか?
>左クリックならうまくいきます。
何が上手くいくんでしょうか?
右クリック時にCTreeCtrl::SelectItem()で選択させてしまうとか
エクスプローラやOutlook Expressなどのように、
右クリックでフォーカスが移動できるようにしたいです。
CTreeCtrl::SelectItem()でもだめでした。
なにか方法はないでしょうか?
よろしくお願いします。
OnRButtonDownの中でSelectItemを使って、カーソルを
任意のアイテムにセットすることができました。
すみません。
しかし、右クリックで選択したアイテムのハンドルを
どうやって取得すればいいかわかりません。
たとえば、OnRButtonDownの中でGetSelectedItemでハンドル
を取得しても、このアイテムのハンドルは取得されていません。
教えていただけませんか。
よろしくお願いします。
CTreeCtrl::HitTest()を使用すればハンドルが取得出来ます。
OnRButtonDownの中で、HitTest()でハンドルを取得して
SelectItemでフォーカスセットしようとしましたが、
フォーカスが右クリックで移動したアイテムにセット
されませんでした。
他に方法はないでしょうか?
そのコードを書いてください。
WM_RBUTTONDOWNをハンドルするのではなく、
NM_RCLICKをハンドルしてみました。
void CLeftView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
CTreeCtrl& tree = GetTreeCtrl();
UINT uFlag;
HTREEITEM item = tree.HitTest(pt, &uFlag);
tree.SelectItem(item);
*pResult = 0;
}
補足です。
CLeftViewは、CTreeViewから派生したクラスです。
sugarさんのやり方でやってみたところ、できました。
CPointにデータをセットしないで、HitTestを呼んでいました。
勉強不足でした。
ありがとうございました。
ちなみにこんな感じでやっていました。
void CXXXX::OnRButtonDown(UINT nFlags, CPoint point)
{
CTreeView::OnRButtonDown(nFlags, point);
TVHITTESTINFO aaa;
tree->HitTest(&aaa);
tree->SelectItem(aaa.hItem);
}
みなさん、本当にありがとうございました。