
環境: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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelでワードアートや図を常に...
-
PDFを(htmlのように)無限に縦...
-
TikTokLiteの自動スクロールの...
-
リストビューをスクロールさせ...
-
エクセルVBAでフォームのListbo...
-
C# Panel領域の下部に余白を設...
-
Visual Basicから Spreadのスク...
-
webページで横方向にアンカーを...
-
ページ読み込み時に自動でスク...
-
文章の自動スクロール
-
スクロールバーの動作で困って...
-
アコーディオンで開かれたパネ...
-
iframeからのリンクでスクロー...
-
WordPressの使い方について
-
新着情報などをスクロールしな...
-
ページ訪問時にiframe内を自動...
-
スクロールしてから指定位置?...
-
スクロール
-
デジタル時計の時刻合わせの方...
-
エクセルのシート上に別のシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでワードアートや図を常に...
-
PDFを(htmlのように)無限に縦...
-
エクセルVBAでフォームのListbo...
-
リストビューをスクロールさせ...
-
アコーディオンで開かれたパネ...
-
Visual Basicから Spreadのスク...
-
大きい表へのスクロールバーの...
-
マウスオーバー→ホイール回転で...
-
vb,netでtextboxの文字を右から...
-
ExcelVBAで他のアプリをスクロ...
-
新着情報などをスクロールしな...
-
マウスでコロコロしたいんですが…
-
リストビューのスクロールバー...
-
Excelで一部分だけを常に表示さ...
-
エクセルで行を固定しその下か...
-
マウスホイールでスクロールで...
-
文章の自動スクロール
-
html js 横軸の長いチャート
-
上下キーを押すと、ページスク...
-
C#:ListViewでのスクロールイベ...
おすすめ情報