• ベストアンサー

リストビューの表示開始行変更

リストビューで垂直スクロールバーを使用せず、ボタンがクリックされた時に、ページ切り替えみたいな事をしたいのですが、どのようにしたらいいのでしょうか? Visual C++ 6.0 SP6 Windows XP Pro SP3 どなたか助言をお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Win32SDKでやるなら ・・・ LVM_GETTOPINDEX, LVM_GETCOUNTPERPAGE, LVM_GETITEMRECT, LVM_GETITEMCOUNT, LVM_SCROLL を使えば出来そうです ListViewのハンドルがhLVだとすると // 先頭の取得 int nTop = SendMessage( hLV, LVM_GETTOPINDEX, 0, 0 ); // 表示可能なアイテム数 int nPage = SendMessage( hLV, LVM_GETCOUNTPERPAGE, 0, 0 ); // ListViewの設定アイテム数 int nItems = SendMessage( hLV, LVM_GETITEMCOUNT, 0, 0 ); RECT rc; // アイテムの矩形領域 SendMessage( hLV, LVM_GETITEMRECT, 0, (LPARAM)&rc ); int h = rc.bottom - rc.top; for ( int n = 0; n < nPage; n++ ) {   // ListViewの下方へのスクロール   SendMessage( hLV, LVM_SCROLL, 0, (LPARAM)h );   // 上方へスクロールは -h を与えます } といった具合です ♯ スクロールが必要なのかの判断部分はコーディングしてください

taka077
質問者

お礼

回答、ありがとうございます。 早速、一つずつ確認しました。 が、「アイテムの矩形領域」で、rc.topとrc.bottomの値が「-858993460」となっており、hが0でスクロールが確認出来ません。 LVM_GETITEMRECTで検索を掛けてみましたが、ヒントすら掴む事が出来ませんでした。 申し訳ありませんが、再度、助言をお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

プログラミングスタイルも明記した方がいいですね MFCとかWin32SDKとか MFCならばコントロールのメンバー関数で出来る場合がありますので CRect rc; CListCtrl& lst = m_ListView.GetListCtrl(); lst.GetItemRect( 0, rc, LVIR_LABEL ); といった具合で ・・・

taka077
質問者

お礼

回答、ありがとうございます。お礼が遅くなりました。 >プログラミングスタイルも明記した方がいいですね >MFCとかWin32SDKとか 次回から明記するようにします。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

アイテムの矩形の取得方法が間違ってますね ・・・ rc.left = LVIR_LABEL; SendMessage( hLV, LVM_GETITEMRECT, (LPARAM)rc); といった具合です ラベルの大きさならLVIR_LABEL アイコンの大きさなら LVIR_ICON 選択サイズなら LVIR_SELECTBOUNDS をrc.leftに設定して呼び出しましょう # MSDNなどで確認する癖をつけましょう

taka077
質問者

お礼

いつもありがとうございます。 無事、  RECT rc;  rc.left = LVIR_LABEL;  ::SendMessage( m_ListView.m_hWnd, LVM_GETITEMRECT, 0, (LPARAM)&rc );  m_ListView.GetClientRect(&rc);  int h = rc.bottom - rc.top; でビューの縦サイズを取得出来ました。 但し、ヘッダを含む?サイズのようなので、 h = h / (nPage + 1); で1行の高さを求め、for()で1行分ずつスクロールするようにしました。 色々調べていたら、以下の方法でもいいのかなというのが見付かりました。 CRect rect; m_ListView.GetClientRect(&rect); int h = rect.Height() / (nPage + 1); >MSDNなどで確認する癖をつけましょう 了解です!

taka077
質問者

補足

taka077です。 すみません!お礼に記載した内容に間違いがありました! >但し、ヘッダを含む?サイズのようなので、 >h = h / (nPage + 1); >で1行の高さを求め、for()で1行分ずつスクロールするようにしました。 int h = rc.bottom - rc.top; で、ちゃんと1行分の高さが取得出来ていました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リストビューのスクロールバーを非表示にしたい

    eMbedded Visual C++ 4.0 、MFC 、ダイアログベースでプログラミングをしています。 リストビューのスクロールバーを非表示にしてCListCtrl::Scrollを使い別のプログラムからスクロールさせたく、 「EnableScrollBarCtrl」や「ShowScrollBar」を使ってみたりしましたが非表示にできません。 リストビューのプロパティで「スクロールさせない」にチェックすると、CListCtrl::Scrollによるスクロールができなくなってしまいます。 非表示でCListCtrl::Scrollでスクロールできる方法をご存知でしたら教えてください。 なぜ別のプログラムでスクロールさせたいのかといいますと複数のリストビューを連動させてスクロールさせたいためです。 eMbedded Visual C++ 4.0はVC++6.0と似ているようですのでそのあたりに詳しい方アドバイスをください。

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

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

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

    いつもお世話になっております。 リストビューのスクロールバーについて教えて頂きたい事がございます。 ご教授よろしくお願いします。 リストビューにスクロールバーが表示されているのか?表示されていないのか?を判定する方法はありますか? よろしくお願いします。

  • VCのリストビュー

    いつもお世話になっております。 今回はリストビューについてお聞きします。 リストビューではリストの個数が変わる場合、限界を超えると右側にスクロールバーが出るのですが、 これをリスト個数が少ない時でも常に表示しておくことは可能でしょうか? リストが増えてバーが出てきたとき、カラムのバランスが変わってしまうのを防ぎたいのですが何か方法がありましたらご教授お願いします。

  • リストビューのスクロール

    お世話様です。 C#.NET(1.1)でプログラミングしています。 リストビューですが以下の設定を行っています。 CheckedBox=true View=List MultiSelect=true Scrollable=true ※カラム関係は何も設定してません。 この設定で、アイテムをどんどん追加していき、ListViewの最大高さまで アイテムが埋まると、水平スクロールが表示され2列目が表示されるのですが、これを垂直スクロールで下に追加という形をとりたいのですが、 どうしたらいいのかわからないです。 (なぜCheckListBoxにしないのかというのは、複数選択ができないからです。) ご存知の方、ご教授願います。(××)

  • リストビューの水平スクロール抑止と文字列の表示位置

    リストビューを使ったプログラムで、以下の2点についてどうしていいか分からないので、どなたか助言をお願いします。 (1)可視領域を23行としたリストビューで、起動時はスクロールを水平・垂直ともに抑止しておきます。ボタンをクリックする度に1行ずつ0行に挿入し、データが24行以上で垂直スクロールを許可してるのですが、挿入した行に+1行が表示されてしまいます。GetItemCount()で調べてもやはり1行多く表示されてます。カスタムドローで交互に背景色を変えていますが、その行に背景色はありません。水平スクロールを抑止している事が原因でしょうか?スクロールの抑止は、以下を参考にさせて貰ってます。 http://homepage3.nifty.com/mitui707/VisualC/VClistview_op1.html/ (2)ヘッダ部の表示はセンタリング、アイテムは左寄せにしたいのですが、アイテムの左寄せをどのようにすれば良いのか分かりません。 ヘッダ部の設定 LVCOLUMN myColumn; myColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; myColumn.fmt = LVCFMT_CENTER; どなたか助言をお願いします。

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

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

  • リストボックスで任意の行を表示するには?

    vbで多量の行数情報が入ったリストボックスがあります。 垂直スクロールバーを、直接操作しないで、vbより任意の行を表示させたいと思っています。 よいメソッド・関数などをご存知の方、ご教授を宜しくお願い致します。 os:windows2000pro vb:vb6

  • スクロールバーでのピクチャーコントロールやリストビューの移動

    お世話になります。 今回お聞きしたいことは MFCでダイアログ上にリストコントロールとスクロールバー、またはピクチャーコントロールとスクロールバーを設置した際に、スクロールバーの移動に伴って、リストコントロール内の列や、ピクチャーコントロールに表示されている画像の見えている箇所を移動させることが出来るかどうか。 です。 まだ、本格的にプログラムを作り始めてるわけではないのですが、事前にこのような動作が実現可能かどうかお聞きしたく、質問させて頂きました。 もしご存知の方がいましたら、参考になるHPや方法を教えていただければと思っています。参考になるHPがなくても、実現可能かどうかだけ教えて下さるだけでも結構ですので、宜しくお願い致します。 開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • リストビューの列ヘッダーの幅について

    visual basic 6.0です。 リストビューの列ヘッダーの幅を、実行中に変更できないようにするには、どのようなコードを記述すればいいでしょうか。プロパティページでは設定できませんでした。どなたか教えてください。 よろしくお願いします。