none
LIstBoxの最終行の右端を表示方法 RRS feed

  • 質問

  • VB2010でListBoxで水平・垂直スクロールバーを使用してテキストを表示しています。
    デフォルトで先頭行の左端が表示されるので、スクロールバーで最終行と右端に移動して内容を確認しています。
    そこで、手動操作しないで最終行の右端がデフォルトで表示するようにできないでしょうか。
    2013年10月26日 7:04

回答

  • こんな?

    Imports System.Runtime.InteropServices
    Public Class Form1
    
        <DllImport("user32.dll")> _
        Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As UInt32, ByVal lParam As IntPtr) As Boolean
        End Function
        Enum WM As UInteger
            WM_HSCROLL = &H114
        End Enum
        Enum SB As UInt32
            SB_LINEUP = 0
            SB_LINELEFT = 0
            SB_LINEDOWN = 1
            SB_LINERIGHT = 1
            SB_PAGEUP = 2
            SB_PAGELEFT = 2
            SB_PAGEDOWN = 3
            SB_PAGERIGHT = 3
            SB_THUMBPOSITION = 4
            SB_THUMBTRACK = 5
            SB_TOP = 6
            SB_LEFT = 6
            SB_BOTTOM = 7
            SB_RIGHT = 7
            SB_ENDSCROLL = 8
        End Enum
    
        Private listBox1 As ListBox
    
        Sub New()
            InitializeComponent()
    
            listBox1 = New ListBox()
            listBox1.HorizontalScrollbar = True
            listBox1.Dock = DockStyle.Fill
            Me.Controls.Add(listBox1)
    
            For i As Integer = 1 To 100
                listBox1.Items.Add(i.ToString().PadLeft(100, "*"c))
            Next
        End Sub
        Private Sub Me_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load, Me.Resize
            ScrollEnd(listBox1)
        End Sub
    
        Protected Sub ScrollEnd(ByVal lst As ListBox)
            If (lst Is Nothing) Then
                Return
            End If
    
            '垂直方向の最終行を一番下にする
            Dim displayCount As Double = lst.ClientSize.Height / lst.ItemHeight
            Dim index = lst.Items.Count - CInt(Math.Floor(displayCount))
            If (index <= 0) Then
                index = 0
            End If
            lst.TopIndex = index
    
            If (lst.IsHandleCreated) Then
                '水平方向のスクロールバーを右端に移動させる
                PostMessage(lst.Handle, WM.WM_HSCROLL, SB.SB_RIGHT, IntPtr.Zero)
            End If
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク mori mori 2013年10月27日 11:11
    2013年10月27日 4:12

すべての返信

  • こんな?

    Imports System.Runtime.InteropServices
    Public Class Form1
    
        <DllImport("user32.dll")> _
        Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As UInt32, ByVal lParam As IntPtr) As Boolean
        End Function
        Enum WM As UInteger
            WM_HSCROLL = &H114
        End Enum
        Enum SB As UInt32
            SB_LINEUP = 0
            SB_LINELEFT = 0
            SB_LINEDOWN = 1
            SB_LINERIGHT = 1
            SB_PAGEUP = 2
            SB_PAGELEFT = 2
            SB_PAGEDOWN = 3
            SB_PAGERIGHT = 3
            SB_THUMBPOSITION = 4
            SB_THUMBTRACK = 5
            SB_TOP = 6
            SB_LEFT = 6
            SB_BOTTOM = 7
            SB_RIGHT = 7
            SB_ENDSCROLL = 8
        End Enum
    
        Private listBox1 As ListBox
    
        Sub New()
            InitializeComponent()
    
            listBox1 = New ListBox()
            listBox1.HorizontalScrollbar = True
            listBox1.Dock = DockStyle.Fill
            Me.Controls.Add(listBox1)
    
            For i As Integer = 1 To 100
                listBox1.Items.Add(i.ToString().PadLeft(100, "*"c))
            Next
        End Sub
        Private Sub Me_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load, Me.Resize
            ScrollEnd(listBox1)
        End Sub
    
        Protected Sub ScrollEnd(ByVal lst As ListBox)
            If (lst Is Nothing) Then
                Return
            End If
    
            '垂直方向の最終行を一番下にする
            Dim displayCount As Double = lst.ClientSize.Height / lst.ItemHeight
            Dim index = lst.Items.Count - CInt(Math.Floor(displayCount))
            If (index <= 0) Then
                index = 0
            End If
            lst.TopIndex = index
    
            If (lst.IsHandleCreated) Then
                '水平方向のスクロールバーを右端に移動させる
                PostMessage(lst.Handle, WM.WM_HSCROLL, SB.SB_RIGHT, IntPtr.Zero)
            End If
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク mori mori 2013年10月27日 11:11
    2013年10月27日 4:12
  • 返信いただいたコードを使用させていただいたところ、『水平方向のスクロールバーを右端に移動』の個所で『DLL 'user3.dll'を読み込めません』と指定されたモジュールが見つからない。とのメッセージが表示されました。

    ’user3.dll’が必要なようですが、これはどのように用意したらよいのでしょうか。

    なお、この部分をコメントにすると最終行に移動していることを確認できました。

    よろしくお願いします。

    • 編集済み mori mori 2013年10月27日 10:25
    2013年10月27日 10:24
  • 手打ちでコードを入力されたんでしょうか?
    DllImport の行をよく見直していただくとわかると思いますが、user3.dll ではなく、user32.dll です。
    2013年10月27日 10:58
    モデレータ
  • ウィンド内に1行で表示されていたので、少しずつコピーしながら、コピー出来なかった部分は手入力しました。

    ’user32.dll’としたら最終行の右端を表示できました。

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

    2013年10月27日 11:11