LVM_SETICONSPACING与.NET中的虚拟ListView

时间:2013-07-31 19:27:09

标签: .net winforms listview winforms-interop

我有一个所有者绘制的虚拟列表视图。我将视图设置为LargeIcon,我将LargeImageList设置为适当的图像列表,但是当我调用LVM_SETICONSPACING时,它不起作用!也就是说 - 无论我投入什么价值,它都没有效果。

我用:

 Const LVM_FIRST As Long = &H1000
 Const LVM_SETICONSPACING As Long = LVM_FIRST + 53
 WinAPI.SendMessage(ListView.Handle, LVM_SETICONSPACING, 0, cy * 65536 + (cx And 65535))

我也尝试过:

 WinAPI.SendMessage(ListView.Handle, LVM_SETICONSPACING, 0, cy * 65536 + cx)
 WinAPI.SendMessage(ListView.Handle, LVM_SETICONSPACING, 0, cx * 65536 + cy)

无论cx和cy使用什么值,所有人都无所不能。我试过从10岁的小到大到400的两者 - 没有区别。

之后我尝试刷新列表 - 没有区别。 item.bounds保持不变,我在图标行之间有30px的高间距。我如何摆脱那个间距? 我还尝试使用Ints和IntPtr-s替换SendMessage。

也许问题是我使用Windows 8 64位(虽然程序是32位)?或者在虚拟模式下,listview会忽略此消息?

我甚至通过在WndProc覆盖中捕获消息来检查消息是否已发送。

拿2:

我甚至尝试使用IntPtr,因为有人建议没有运气。 我还尝试了垂直和水平间距为5的所有可能值: & H50005000,& H00050005,以及& H5000000050000000,& H0000000500000005。没有区别,就好像完全被忽略了一样。也许LVM_SETICONSPACING有不同的值?

欢迎任何建议。

谢谢。

1 个答案:

答案 0 :(得分:0)

使用cx和cy的逐位移位来创建正确的IntPtr,而不是使用乘法。此方法在另一个post中进行了描述。

Private Sub SetImageSpacingForListView(ByVal lView As ListView, ByVal cx As Short, ByVal cy As Short)
  ' http://qdevblog.blogspot.co.uk/2011/11/c-listview-item-spacing.html
  ' http://msdn.microsoft.com/en-us/library/bb761176(VS.85).aspx

  Dim LVM_FIRST As Integer = &H1000
  Dim LVM_SETICONSPACING As Integer = LVM_FIRST + 53
  WinAPI.SendMessage(lView.Handle, LVM_SETICONSPACING, IntPtr.Zero, CType(MakeLong(cx, cy), IntPtr))
End Sub

Private Function MakeLong(ByVal lowPart As Short, ByVal highPart As Short) As Integer
  Return CType(CType(lowPart, UShort) Or CType(highPart << 16, UInteger), Integer)
End Function