• ベストアンサー

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

リストビューで垂直スクロールバーを使用せず、ボタンがクリックされた時に、ページ切り替えみたいな事をしたいのですが、どのようにしたらいいのでしょうか? 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