MFCのCListCtrlでスクロールを検出

このQ&Aのポイント
  • MFCのダイアログアプリでレポートスタイルのリストコントロールを使用し、スクロールを検出したい
  • 最初に始めの100行を表示し、ユーザーがスクロールバーを一番下まで移動させるたびに次の100行を追加挿入して表示させたい
  • LVN_BEGINSCROLL、LVN_ENDSCROLLなどのイベントハンドラを使用してスクロールバーを動かしてもイベントが呼ばれない
回答を見る
  • ベストアンサー

MFCのCListCtrlでスクロールを検出

MFCのダイアログアプリを作成しています。 レポートスタイルのリストコントロールを配置して、全部で1000行のアイテム を表示させたいのですが、いきなり1000行は多すぎるので最初に始めの100行分 だけ表示して、ユーザーがスクロールバーを一番下まで移動させるたびに 次の100行を追加挿入していって表示させるようにしたいと思っています。 そこでまずはユーザーがスクロールバーを一番下まで移動させたタイミングを イベントで拾おうと思ったのですが、それっぽいLVN_BEGINSCROLL、 LVN_ENDSCROLLなどのイベントハンドラを作成してスクロールバーを 動かしてもうまく呼ばれません。どうすればいいかご教示ください

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>それっぽいLVN_BEGINSCROLL、LVN_ENDSCROLLなどのイベントハンドラを http://msdn.microsoft.com/en-us/library/bb774802%28v=vs.85%29.aspx ビジュアルスタイルを有効にしていたり、マニュフェストファイルの設定が必要だったりする…んですかね? CListCtrlを継承したクラスを作成して、そのクラスのメッセージハンドラにWM_VSCROLLを追加…というのでどうでしょう? # コントロール変数は作成したクラスの変数…ということになります。 スクロールバーを操作したときにOnVScroll()がコールされます。 スクロールバーのどの位置にあるのか…というのは入ってきませんので… GetScrollInfo()辺りで情報を取得…でしょうか。 SB_ENDSCROLLの時…ですかね…。スクロールバーのボタン押されたままだとどうなるか微妙? クライアントのサイズなどを取得して(CListCtrlのクライアントの左下辺りの座標で)CListCtrl::HitTest()で確認…というのは邪道ですかねぇ。 取得したアイテムのインデックスが最終インデックスまたは-1の時に最下段までスクロールした…とか。 # ちなみに、使用しているVSのバージョン、またはMFCのバージョンも明記した方が良い…かと思われます。 # 上記(OnVScroll())のはVS2005にて確認…です。 >いきなり1000行は多すぎるので スレッドを作成して、そっちでアイテムを追加していく…というのもアリでしょう。 同期処理はちょっと手間かも知れませんが。 # ファイルが沢山あるディレクトリをエクスプローラで開いたときに、適度に追加されていく…ということがあります。

tsuruharu
質問者

お礼

言われたとおり、CListCtrlの派生クラスを作ってそのイベントハンドラで VSCROOLイベントを拾うことができました。 また、そこでGetScrollPos()とGetScrollLimit()を使って、 スクロールバーの最下位置を検出することができました。 無事解決しました。迅速な回答ありがとうございました。

関連するQ&A

  • リストビューのスクロールについて

    VC.NET MFC でリストビュー(CListCtrl)を使用しています。 そのリストビューにある垂直スクロールバーを操作しても、 PreTranslateMessage()になにもコマンドが送られてきません。 ・・・(1) また、LVN_BEGINSCROLLのハンドラを追加してみたんですが、 コンパイル時にLVN_BEGINSCROLLを認識してもらえません。 (コンパイルエラー) ・・・(2) いろいろ調べてcommctrl.hをインクルードしても 必要なDLL(Comctl32.lib ? Comclt32.lib)をプロジェクトに参加させても認識してもらえませんでした。 リストビューのスクロールバー操作時の処理をオーバーロードしたいのですが、できなくて困っています。 どのようにすればよろしいでしょうか? 助言のほどよろしくお願いします。

  • リストコントロールのスクロールバーを操作無効にするには

    お世話になります、fujicafeと申します。 現在、VC++でMFCのダイアログベースのアプリケーションを作成し、そこでリストコントロールを配置させています。 リストコントロールは自動的に垂直方向のスクロールバーを表示させるようにしています。 そこで質問なのですが、現在、リストコントロールの垂直方向のスクロールをスクロールバーの操作ではなく、キー操作によって行おうと思っているのですがどのようにすればスクロールバーの操作を無効にできますでしょうか? ポイントとしては ・リストコントロールの自動的に表示させる垂直スクロールバーはそのまま表示させたい(スクロールバーは全体行での現在の行の位置を示すだけ) ・リストコントロールの垂直方向の移動はキー操作でしたい。 これを実現するには、やはりリストコントロールのスクロールバー表示を無しにし、別でスクロールバーを設置させるしか方法はないでしょうか? 現状で、キー操作でのリストコントロールのスクロールバーの操作は実現できていますので、出来ればリストコントロールのスクロールバーの操作の無効のみが出来ればいいなと思っております。 ご意見がありましたら、よろしくお願いいたします。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • ダイアログをスクロールさせるには

    MFCでウィンドウにダイアログボックスを張り付けた時に、 ダイアログボックスの表示させたい領域よりウィンドウサイズが小さい場合、 自動でスクロールバーを表示させるようにするにはどうすればいいのでしょうか? ダイアログで表示させたい領域を区切ってスクロール判断をさせるようにはできないのでしょうか?

  • リストビューでカレントセルを変更したタイミングのイベントハンドラ

    VC++2005のMFCにて、プログラムを作成しています。 プログラムの内容として、リストビューでカレントセルが移動したタイミングで、 カレントセルの行数を取得するというものです。 リストビュー上で、カレントセルが移動したタイミングで、 処理に入るイベントハンドラは、MFCで用意されているのでしょうか? LVN_KEYDOWNイベントのハンドラで、リスト上で各種移動キー(上、下、PgUp、PgDn)が押された際に、 処理を行なう方法もありますが、この方法だとセル移動キーを全て網羅させないといけないので。。 また、もしそのようなハンドラが存在しなければ、 カレントセルが移動したタイミングで検知させる良い方法があれば、 ご教示お願い致します。

  • テーブルにスクロールバーをつける

    テーブルにスクロールバーをつけることは出来るでしょうか。 行数は画面に表示させておくのが5行くらいで、5行以降はスクロールバーで移動させ表示させると言う感じにしたいのです。 HTMLで出来なければ他の方法も教えて下さい。

    • ベストアンサー
    • HTML
  • Access フォームのスクロール

    お世話になります。 Access2010 現在Accessにて、ある情報の登録フォームを作成しております。 登録項目が複数あり、1画面(デスクトップのサイズ)だけでは 収まりきれないないので、登録フォームをスクロールさせたいと 思います。 但し、ユーザーには登録フォームのサイズを調整できないようにしたいので 境界線スタイルを「ダイアログ」にしております。 <質問> 境界線スタイルが「細線」か「ダイアログ」だと、スクロールバーを 表示する設定にしても、表示されません。 「サイズ調整可」にするとスクロールバーが表示されます。 スクロールバーを表示しつつ、フォームのサイズが変更されないように 出来ないでしょうか。 ご教示の程、宜しくお願い致します。

  • スクロール画面

    下記内容を参考にまずサンプルを作っています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=974758 使用versionはMXのバージョン6です。 作成し、パブリッシュすると、スクロールバーは表示でき、クリックするとスクロールバーやスライダは動いたものの、画像(上記参考ページでのムービークリップ「sheet」)が動きません。 手順としては個々のムービークリップを「ムービークリップsheet」に配置し、シーン1で「sheet」を配置しその上にマスクレイヤー、その上にスクリプトレイヤー、一番下にはスクロールバーのレイヤーを配置し、スクロールバーには「sc_bar」のインスタンス名をつけています。配置はX座標0にしていますがマスクの矩形のみ、X座標を0にするとマスク矩形の中心が用紙の左端に来てしまいます。これが何か関係あるのでしょうか。スクロールバーや、ムービークリップ「sheet」はx0地点の用紙の左端に揃っています。ムービークリップが動かない原因として何が考えられるでしょうか?わかる方、すみません、。教えてください。

    • ベストアンサー
    • Flash
  • 3つの水平スクロールバーの違いについて知りたいです。

    3つの水平スクロールバーの違いについて知りたいです。 僕は、VC++6.0でエディタを作ろうとしているWINAPI初心者です。 ダイアログボックスにリソースエディタで3つスクロールバーを配置しました。 しかし、どうすれば、それぞれのスクロールバーが動いたか知ることが出来ませんでした。 ネットで検索しても出てこないので、ここで質問させて貰いました。 よろしくお願いします。

  • Excelで1.2行目だけ固定して3行目以降をスクロールさせたい

    Excelで、スクロールバーを横に移動させても、1・2行目だけは動かずに、3行目以降はスクロールするようにしたいです。 つまり、画面を移動させても、1・2行目(タイトル行というか見出しというか)だけはずっと同じものが表示されて、3行目以下のデータだけがスクロールするようにしたいのですが、できますでしょうか? ウインドウ枠の固定を使ってみたのですが、縦にスクロールした時は1.2行目を表示したままにすることができましたが、横にスクロールすると1.2行目も横に移動して消えてしまいました。 よろしくお願いします。

  • MFCで追加済みのイベントハンドラ確認方法

    お世話になります。 Visual Studio2010ProffecionalのMFCにおける 追加済みのイベントハンドラ確認方法について教えてください。 ダイアログ作成画面では各コントローラのプロパティ画面の 右上にある雷マークから、そのコントローラに対し 何のハンドラが登録されているかが確認できます。 しかしメニュー作成画面でのプロパティ画面では 上述のような雷が出てきません。 各メニューに何のイベントハンドラを追加したかを 後で一覧にして確認する方法はないのでしょうか。 ご回答くださいますようよろしくお願いします。