0

リストビューで画像を表示するために画像リストを使用しています。これまでのところ、画像リストにすべての画像を表示できましたが、各画像間の間隔が非常に大きくなっています。そのため、別の問題を引き起こしたSend Message メソッドを使用しました。マウスをクリックするか、マウスを移動すると(ホットトラッキングが有効)、画像が見えなくなります。この問題を解決するにはどうすればよいですか?

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
    Private Shared Function SendMessage(ByVal hwnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
    End Function

    Const LVM_FIRST As Integer = &H1000
    Const LVM_SETICONSPACING As Integer = LVM_FIRST + 53

    Public Sub SetSpacing(ByVal x As Int16, ByVal y As Int16)
        SendMessage(Me.ListView1.Handle, LVM_SETICONSPACING, 0, x * 65536 + y)
        Me.ListView1.Refresh()
    End Sub


    Private Sub Display()
        For i As Integer = 0 To ImageList1.Images.Count - 1
            Dim item As New ListViewItem()
            item.ImageIndex = i
            Me.ListView1.Items.Add(item)
        Next
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Display()
        SetSpacing(200, 16)
    End Sub

End Class

マウス移動前:

ここに画像の説明を入力

マウス移動後:

ここに画像の説明を入力

また、リストビューのマージンがすべて= 3に設定されていますが、この大きな左マージンがあります

画像の最初の列が表示されていません!!!

ここに画像の説明を入力

4

2 に答える 2

0

x 引数と y 引数には、アイコンの幅と高さを含める必要があります。

MSDN ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb761176(v=vs.85).aspx ):

lParam の値は、アイコン ビットマップの左上隅を基準にしています。したがって、重複しないアイコン間の間隔を設定するには、lParam 値にアイコンのサイズと、アイコン間に必要な空きスペースの量を含める必要があります。アイコンの幅を含まない値を指定すると、オーバーラップが発生します。

そして、反転する必要があります:

x * 65536 + y -> x + y * 65536

y は HIWORD にあり、x は LOWORD にある

于 2012-06-06T15:29:16.183 に答える