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

鼠标移动之前:

在此处输入图像描述

鼠标移动后:

在此处输入图像描述

我也有这么大的左边距,虽然 listview 边距设置为 All = 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 回答
0

这是我与 LargeIcon 一起使用的东西,从这里开始工作: https ://qdevblog.blogspot.com/2011/11/c-listview-item-spacing.html

using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

public int MakeLong(short lowPart, short highPart)
{
     return (int)(((ushort)lowPart) | (uint)(highPart << 16));
}
  
public void ListViewItem_SetSpacing(ListView listview, short leftPadding, short topPadding) 
{     
    const int LVM_FIRST = 0x1000;     
    const int LVM_SETICONSPACING = LVM_FIRST + 53;     
    SendMessage(listview.Handle, LVM_SETICONSPACING, IntPtr.Zero, (IntPtr)MakeLong(leftPadding, topPadding));      
}

然后你像这样使用它:

ListViewItem_SetSpacing(this.listView1, 96 + 16, 96 + 16); // width image + H spacing, height image + V spacing
于 2021-11-24T19:01:03.760 回答