2011-12-24 5 views
0

Я использую список изображений для отображения изображений в виде списка. Пока я могу отображать все изображения в списке изображений, но расстояние между каждым изображением очень велико. Поэтому я использовал Send Message method, что породило еще одну проблему. Теперь, когда я нажимаю или перемещаю мышь (горячее отслеживание включено), любое изображение становится невидимым. Как я могу решить эту проблему ?Как отрегулировать расстояние между изображениями в виде списка

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 

Перед Маус-Move:

enter image description here

После Маус-Move:

enter image description here

Также у меня есть этот большой левый край, хотя запас ListView установлен на все = 3

Первый столбец изображений не отображается !!!

enter image description here

+0

относится только к ListViews с "Icon" вид стиля. Это то, что вы используете? –

+0

@CodyGray Я использую Listview.View = LargeIcon –

ответ

0

В вашем х и у аргументов, вы должны включать в себя ширину и высоту значков.

MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/bb761176(v=vs.85).aspx):

Значения для LPARAM являются относительно верхнего левого угла значка растрового изображения. Поэтому для установки интервала между значками, которые не перекрываются, значения lParam должны содержать размер значка, а также сумму свободного места между значками. Значения, которые не включают ширину значка , приведут к перекрытию.

И вам нужно, чтобы инвертировать:

x * 65536 + y -> x + y * 65536 

у находится в HIWORD, х находится в `LVM_SETICONSPACING` LOWORD

Смежные вопросы