ツリービューで右クリックでフォーカス移動

[戻る]
たけと 2004/01/07(水) 10:59:04
WindowsXp,VC++6.0で開発しています。

CTreeViewでツリーを表示して、ツリーのアイテムを右クリック
で選択したしたとき、以前のアイテムにフォーカスが戻ってしまいます。
左クリックならうまくいきます。
どうすればいいか教えて頂けませんか?

ツリーの属性は以下のようにしてあります。
ModifyStyle(NULL,TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT |  
TVS_SINGLEEXPAND);

よろしくお願いいたします。

2004/01/07(水) 12:23:09
>CTreeViewでツリーを表示して、ツリーのアイテムを右クリック
>で選択したしたとき、以前のアイテムにフォーカスが戻ってしまいます。
私にはごく普通の動作に思えます(マウスの右ボタンクリック(というよりはボタン
ダウンか?)はキャンセルの扱いだから).... 間違った解釈でしょうか?

>左クリックならうまくいきます。
何が上手くいくんでしょうか?

ひろぴー 2004/01/07(水) 13:09:15
右クリック時にCTreeCtrl::SelectItem()で選択させてしまうとか

たけと 2004/01/07(水) 21:09:04
エクスプローラやOutlook Expressなどのように、
右クリックでフォーカスが移動できるようにしたいです。
CTreeCtrl::SelectItem()でもだめでした。

なにか方法はないでしょうか?

よろしくお願いします。

たけと 2004/01/07(水) 22:51:20
OnRButtonDownの中でSelectItemを使って、カーソルを
任意のアイテムにセットすることができました。
すみません。

しかし、右クリックで選択したアイテムのハンドルを
どうやって取得すればいいかわかりません。
たとえば、OnRButtonDownの中でGetSelectedItemでハンドル
を取得しても、このアイテムのハンドルは取得されていません。

教えていただけませんか。

よろしくお願いします。

ひろぴー 2004/01/08(木) 09:05:45
CTreeCtrl::HitTest()を使用すればハンドルが取得出来ます。

たけと 2004/01/10(土) 19:05:54
OnRButtonDownの中で、HitTest()でハンドルを取得して
SelectItemでフォーカスセットしようとしましたが、
フォーカスが右クリックで移動したアイテムにセット
されませんでした。
他に方法はないでしょうか?

RAPT 2004/01/11(日) 02:14:23
そのコードを書いてください。

sugar 2004/01/11(日) 03:55:15
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;
}

sugar 2004/01/12(月) 01:02:41
補足です。
CLeftViewは、CTreeViewから派生したクラスです。

たけと 2004/01/12(月) 23:34:09
[[解決]]
sugarさんのやり方でやってみたところ、できました。
CPointにデータをセットしないで、HitTestを呼んでいました。
勉強不足でした。
ありがとうございました。
ちなみにこんな感じでやっていました。

void CXXXX::OnRButtonDown(UINT nFlags, CPoint point)
{
    CTreeView::OnRButtonDown(nFlags, point);

    TVHITTESTINFO aaa;
    tree->HitTest(&aaa);
    tree->SelectItem(aaa.hItem);
}

みなさん、本当にありがとうございました。

古いスレッドには追加発言できません。