我有一个所有者绘制的虚拟列表视图。我将视图设置为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有不同的值?
欢迎任何建议。
谢谢。
答案 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