tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^6: ListViewのスクロール【修正】
投稿日: 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

場合によっては、ダミーのテキストボックス等を使ってそちらへフォーカスを移す事で。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。