ツリービューで右クリックでフォーカス移動 – プログラミング – Home

ツリービューで右クリックでフォーカス移...
 
通知
すべてクリア

[解決済] ツリービューで右クリックでフォーカス移動


たけと
 たけと
(@たけと)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

WindowsXp,VC++6.0で開発しています。

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

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

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


引用未解決
トピックタグ
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

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

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


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

右クリック時にCTreeCtrl::SelectItem()で選択させてしまうとか


返信引用
たけと
 たけと
(@たけと)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

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

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

よろしくお願いします。


返信引用
たけと
 たけと
(@たけと)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

OnRButtonDownの中でSelectItemを使って、カーソルを
任意のアイテムにセットすることができました。
すみません。

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

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

よろしくお願いします。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

CTreeCtrl::HitTest()を使用すればハンドルが取得出来ます。


返信引用
たけと
 たけと
(@たけと)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

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


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

そのコードを書いてください。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

補足です。
CLeftViewは、CTreeViewから派生したクラスです。


返信引用
たけと
 たけと
(@たけと)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

sugarさんのやり方でやってみたところ、できました。
CPointにデータをセットしないで、HitTestを呼んでいました。
勉強不足でした。
ありがとうございました。
ちなみにこんな感じでやっていました。

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました