listview tile layout problem (vb.net)
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 (currently a blank square) ABOVE the album name. It always is on the side... how do I do it? I've tried adding column headers and alsorts...
code to set up the listview
Dim myImageList As ImageList
albumList.View = View.Tile
albumList.TileSize = New Size(120, 150)
' Initialize the item icons.
myImageList = New ImageList()
myImageList.Images.Add(Image.FromFile("c:/test.jpg"))
myImageList.ImageSize = New Size(80, 80)
albumList.LargeImageList = myImageList
I then do a loop to display each album name which uses
Dim item0 As New ListViewItem(New String() _
{Albums(i).Name}, 0)
albumList.Items.Add(item0)
the output is http://i111.photobucket.com/albums/n122/mfacer/Screenshot2010-05-02at164815.png
but as i said, I want the album name under the orange开发者_如何学运维 box....
any ideas?? Thanks for any info!
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
精彩评论