プロが教えるわが家の防犯対策術!

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

Visual C++ 6.0 SP6
Windows XP Pro SP3

どなたか助言をお願いします。

A 回答 (3件)

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 を与えます
}
といった具合です
♯ スクロールが必要なのかの判断部分はコーディングしてください
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。

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

申し訳ありませんが、再度、助言をお願いします。

お礼日時:2008/12/16 10:22

プログラミングスタイルも明記した方がいいですね


MFCとかWin32SDKとか

MFCならばコントロールのメンバー関数で出来る場合がありますので
CRect rc;
CListCtrl& lst = m_ListView.GetListCtrl();
lst.GetItemRect( 0, rc, LVIR_LABEL );
といった具合で ・・・
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。お礼が遅くなりました。

>プログラミングスタイルも明記した方がいいですね
>MFCとかWin32SDKとか
次回から明記するようにします。

ありがとうございました。

お礼日時:2008/12/17 08:45

アイテムの矩形の取得方法が間違ってますね ・・・



rc.left = LVIR_LABEL;
SendMessage( hLV, LVM_GETITEMRECT, (LPARAM)rc);
といった具合です

ラベルの大きさならLVIR_LABEL
アイコンの大きさなら LVIR_ICON
選択サイズなら LVIR_SELECTBOUNDS
をrc.leftに設定して呼び出しましょう

# MSDNなどで確認する癖をつけましょう

この回答への補足

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

補足日時:2008/12/16 15:37
    • good
    • 0
この回答へのお礼

いつもありがとうございます。

無事、
 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などで確認する癖をつけましょう
了解です!

お礼日時:2008/12/16 15:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています