タイトル | : Re^6: ListViewのスクロール【修正】 |
記事No | : 10739 |
投稿日 | : 2012/03/12(Mon) 23:25 |
投稿者 | : VBレスキュー(花ちゃん) |
>SendMessageによる制御の例、ありがとうございます。 >なるほど、そういう手もありますね。
すみません、上記の件は、私の勘違いでした。 ListView 上では動作しません。
>1.現在ListViewに表示されている行数 >2.現在表示されているListViewの最下行のIndex
なら下記のようにすれば求めることが可能です。
Dim oldTop As Integer = ListView1.TopItem.Index Dim itemBottom As Integer = 0 For i As Integer = oldTop To ListView1.Items.Count - 1 ListView1.EnsureVisible(i) If oldTop < ListView1.TopItem.Index Then itemBottom = i Exit For End If Next Dim viewRow As Integer = itemBottom - ListView1.TopItem.Index + 1 Debug.Print(viewRow.ToString)
簡易的には ListView のクライアント領域の高さ - ヘッダーの高さ(24) \ GetItemRect で クライアント領域 に表示されている行数を求める事ができます。 (ヘッダーの高さ = フォントサイズ 9 〜16 なら 24 ですが...。)
別途、オーナードローの機能を利用すれば、ヘッダー等の高さが取得できるので 計算だけで的確な表示行数等必要事項が取得できます。 (これなら、フォントサイズを色々変更されても対応できる)
ついでに、マウスのテストをしたコードを掲載しておきます。
3/14 12:43 修正
SendMouse.Helper の使用例と DLL は、下記参照 SendInput関数のDLL化によるマウス操作の簡単自動化(VB.NET)
http://www.hanatyan.sakura.ne.jp/patio/read.cgi?no=315
Private Sub Form1_KeyDown(sender As Object, e As _ System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown '計算値の誤差? (取得位置と設定位置でずれるので修正) Dim mpo As Point = New Point(Cursor.Position.X + 1, Cursor.Position.Y + 1) ListView1.HideSelection = False Dim Si As New SendMouse.Helper Dim Cpos As Point = ListView1.ClientRectangle.Location Dim Spos As Point = ListView1.PointToScreen(Cpos) If e.KeyCode = Keys.Down Then Spos.X = Spos.X + ListView1.Width - 12 Spos.Y = Spos.Y + ListView1.ClientSize.Height - 10 Si.SendMouse(Spos, mpo, 0, 1) End If If e.KeyCode = Keys.Up Then Spos.X = Spos.X + ListView1.Width - 12 Spos.Y = Spos.Y + ListView1.Top - 6 Si.SendMouse(Spos, mpo, 0, 1) End If End Sub
場合によっては、ダミーのテキストボックス等を使ってそちらへフォーカスを移す事で。
|