0

我有一个所有者绘制的虚拟列表视图。我将视图设置为 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。我如何摆脱这种间距?我还为 SendMessage 尝试了 Ints 和 IntPtr-s 的变体。

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

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

取2:

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

欢迎大家提出意见。

谢谢你。

4

1 回答 1

0

使用 cx 和 cy 的按位移位来创建正确的 IntPtr 可以代替使用乘法。此方法在另一篇文章中进行了描述。

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
于 2014-03-13T16:09:32.230 回答