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 は変更されず、アイコンの行間の高さは 30 ピクセルです。その間隔をなくすにはどうすればよいですか?SendMessage の Ints と IntPtr-s を使用したバリアントも試しました。

おそらく問題は、Windows 8 64ビットを使用していることです(プログラムは32ビットですが)?または、仮想モードでは、リストビューがこのメッセージを無視するという事実は?

WndProc オーバーライドでメッセージをトラップして、メッセージが送信されることも確認しました。

テイク 2:

運がないことを示唆している人もいるので、IntPtrを試してみました。また、5 の縦と横の両方の間隔について、可能なすべての値を試しました。違いはありません。まるで完全に無視されているかのようです。LVM_SETICONSPACING の値が異なるのではないでしょうか?

どんな提案でも大歓迎です。

ありがとうございました。

4

1 に答える 1

0

正しい IntPtr を作成するために cx と cy でビットごとのシフトを使用すると、乗算を使用する代わりに機能します。この方法は別の投稿で説明されています。

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 に答える