listview tile layout problem (vb.net)

后端 未结 1 1608
深忆病人
深忆病人 2020-12-11 20:06

I have a listview which displays (eventually) an album cover of an itunes play list with the album name under it. the problem I am having is that I cannot get the album art

相关标签:
1条回答
  • 2020-12-11 20:36

    That is the baked-in arrangement for tile view. If you want the labels underneath the images then you have to set View = LargeIcon. If that produces an undesirable spacing of images then you can P/Invoke SendMessage() to send the LVM_SETICONSPACING message. This worked well:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    class TileView : ListView {
      public TileView() {
        mSpacing = new Size(48, 48);
      }
      private Size mSpacing;
      public Size IconSpacing {
        get { return mSpacing; }
        set {
          mSpacing = value;
          updateSpacing();
        }
      }
      protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        updateSpacing();
      }
      private void updateSpacing() {
        if (this.IsHandleCreated) {
          SendMessage(this.Handle, 0x1000 + 53, IntPtr.Zero, (IntPtr)((mSpacing.Height << 16) | mSpacing.Width));
        }
      }
      [DllImport("user32.dll")]
      private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    }
    

    Change the new IconSpacing property in the designer to work well with the size of the images in your ImageList. You'll see the effect immediately.


    Public Class TileView
      Inherits ListView
    
      Public Sub New()
        mSpacing = New Size(48, 48)
      End Sub
    
      Private mSpacing As Size
    
      Public Property IconSpacing As Size
        Get
          Return mSpacing
        End Get
        Set(ByVal value As Size)
          mSpacing = value
          updateSpacing()
        End Set
      End Property
    
      Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
        MyBase.OnHandleCreated(e)
        updateSpacing()
      End Sub
    
      Private Sub updateSpacing()
        If Me.IsHandleCreated Then
          SendMessageW(Me.Handle, &H1000 + 53, IntPtr.Zero, CType((mSpacing.Height << 16) Or mSpacing.Width, IntPtr))
        End If
      End Sub
    
      Private Declare Function SendMessageW Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr) As IntPtr
    End Class
    
    0 讨论(0)
提交回复
热议问题