環境:WinXP VS2005 MFC使用
CTreeCtrlに階層のあるアイテムを複数個設定しています。
ノード開閉時にカーソル位置にあるアイテムをGetCorsorPos()+HitTest()関数を使用し、取得していました。これは正しいアイテムのハンドルが返ってきています。
ところが、ある程度ノードを開いていき、表示しきれなくなるとスクロールが表示されますが、一番下までスクロールしている状態だとアイテムがうまく取得できていないようです。
おそらく、GetCursorPosが画面上の相対座標を取得するのに対し、HitTestで設定するのはツリーコントロール自体の相対座標なので、スクロールしている分だけずれてしまっているのではないかと思っているのですが、スクロールしているサイズを取得する方法がわかりませんでした。ご存じの方いましたらご教授をお願いします。
※ソース抜粋
void CTestTreeCtrl::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point;
GetCursorPos(&point);
ScreenToClient(&point);
// マウスカーソルの位置からアイテムのハンドルを取得する
HTREEITEM hItem = HitTest(point);
・
・
・
No.1ベストアンサー
- 回答日時:
yutyantyan さんが本当に取得したいのは "どれだけスクロールしたか" ではなくて "スクロールした状態でのツリーのアイテム" ですよね??
"ツリーのアイテムが選択された" ときには TVN_SELCHANGED イベントをキャッチすることができます.
また,そのメッセージハンドラの中は以下のようになっています.
//------------------------------------------------------------
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: ここにコントロール通知ハンドラ コードを追加します。
*pResult = 0;
//------------------------------------------------------------
この TODO の下で
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
とすれば,選択したアイテムを取得できます.
このようにすれば,スクロールした距離を取得する必要もなければ,マウスの座標から HitTest でアイテムを取得する必要もなくなります.
スクロールしている距離を取得する方法の回答にはなっていませんが,この方法ではダメですか?
なるほど。。。
今までスクロール周りの制御しか見ていなかったので、イベントそのものを変えるという発想が出てきませんでした。
大変参考になりました。さっそく試してみます。
貴重なご意見ありがとうございました。
No.2
- 回答日時:
動作検証している時間がありませんが…
CTreeCtrl::GetFirstVisibleItem()でTreeViewの先頭に表示されているアイテムを取得、
CTreeCtrl::GetItemRect()で、そのアイテムの表示されているRECTを取得して、
RECT.leftとRECT.topをHitTestする際のPOINTに加算してみてはどうでしょうか?
先頭のアイテムが一部だけ表示されている状態の時にズレが出るような気もしますが……。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- その他(プログラミング・Web制作) マウスオーバー→ホイール回転でスクロールできない 2 2022/10/31 10:06
- HTML・CSS CSS上での計算を行うためのルールについて教えてください。 3 2022/08/15 14:43
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- ゲーム ゲームトレードでのトラブルについて 1 2023/06/30 21:50
- Excel(エクセル) 「Excelのオプション」の「ユーザーインターフェイスのオプション」の設定値をVBAで取得したい 1 2022/07/31 23:49
- 建設業・製造業 階段の下に付いているこれの意味は? 4 2023/01/06 13:33
- Outlook(アウトルック) Outlookでメールをデリートキーで削除した場合における、メールの移動先フォルダを変更したい。 2 2022/10/31 00:53
- Windows 10 画面上の[タスクバー]の位置の変更 1 2022/06/12 21:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAでフォームのListbo...
-
リストビューをスクロールさせ...
-
Excelでワードアートや図を常に...
-
PDFを(htmlのように)無限に縦...
-
Excelの質問で票の途中に...
-
Excelで一部分だけを常に表示さ...
-
Excelで1.2行目だけ固定して...
-
ExcelVBAで他のアプリをスクロ...
-
ページ訪問時にiframe内を自動...
-
webページで横方向にアンカーを...
-
JTableとJScrollPaneについて
-
複数の画像を横にスクロールさ...
-
リストボックスをクリックした...
-
webデザインです。 プログラミ...
-
Visual Basicから Spreadのスク...
-
VBE画面の縦のスクロールバ...
-
ページ読み込み時に自動でスク...
-
vb,netでtextboxの文字を右から...
-
jQueryで指定した要素を自動横...
-
写真を右から左にスクロールさ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでワードアートや図を常に...
-
エクセルVBAでフォームのListbo...
-
PDFを(htmlのように)無限に縦...
-
リストビューをスクロールさせ...
-
Excelで1.2行目だけ固定して...
-
Excelの質問で票の途中に...
-
Excelで一部分だけを常に表示さ...
-
大きい表へのスクロールバーの...
-
ページ訪問時にiframe内を自動...
-
Visual Basicから Spreadのスク...
-
vb,netでtextboxの文字を右から...
-
webページで横方向にアンカーを...
-
リストビューの表示開始行変更
-
スクロール位置を中央にしたい
-
マウスオーバー→ホイール回転で...
-
VBE画面の縦のスクロールバ...
-
IFRAMEでscrolling="yes|no"の...
-
マウスでコロコロしたいんですが…
-
文章の自動スクロール
-
アコーディオンで開かれたパネ...
おすすめ情報