hola
No entiendo porqué quieres usar API para cambiar el estilo de las cabeceras de un Listview cuando vb.net ya ofrece medios para ello.
ListView.DrawColumnHeader Event
Los cambios se asignan por capas primero estableces lo que sería el 'Background' mediante FillRectangle, si creas otro FillRectangle éste se coloca en la parte superior del anterior en el mismo orden en el que se nombra en el código. Y por último la representación del texto. Si escribes la referéncia al texto antes que aplicar el rectángulo entonces no se verá el texto.
También puedes aplicar una imagen en lugar FillRectangle:
No entiendo porqué quieres usar API para cambiar el estilo de las cabeceras de un Listview cuando vb.net ya ofrece medios para ello.
ListView.DrawColumnHeader Event
Código (vbnet) [Seleccionar]
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListView1.View = View.Details
ListView1.Columns.Add("Header1", 100)
ListView1.Columns.Add("Header2", 100)
ListView1.Items.Add("Item1")
ListView1.Items(0).SubItems.Add("SubItem1")
ListView1.Items.Add("Item2")
ListView1.Items(1).SubItems.Add("SubItem2")
ListView1.OwnerDraw = True
End Sub
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
'//Rectángulos para el Bacground
Try
'Rectángulo inferior
e.Graphics.FillRectangle(Brushes.Black, e.Bounds)
'Rectángulo superior (Se superpone sobre el rectángulo anterior y es más pequeño)
Dim RectPoint As New Point(e.Bounds.X + 1, e.Bounds.Y + 1)
Dim RectSize As New Size(New Point(e.Bounds.Width - 2, e.Bounds.Height - 2))
Dim Rect As New Rectangle(RectPoint, RectSize)
e.Graphics.FillRectangle(Brushes.White, Rect)
Finally
End Try
'//Dibuja el texto (Se superpone a los rectángulos anteriores o imagen de fondo)
Dim sf As New StringFormat()
Try
Select Case e.Header.TextAlign
Case HorizontalAlignment.Center
sf.Alignment = StringAlignment.Center
Case HorizontalAlignment.Right
sf.Alignment = StringAlignment.Far
End Select
Dim headerFont As New Font("Helvetica", 10, FontStyle.Bold)
Try
e.Graphics.DrawString(e.Header.Text, headerFont, Brushes.Black, _
New Point(e.Bounds.X + 5, e.Bounds.Y + 1), sf)
Finally
headerFont.Dispose()
End Try
Finally
sf.Dispose()
End Try
End Sub
Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
e.DrawDefault = True
End Sub
End Class
Los cambios se asignan por capas primero estableces lo que sería el 'Background' mediante FillRectangle, si creas otro FillRectangle éste se coloca en la parte superior del anterior en el mismo orden en el que se nombra en el código. Y por último la representación del texto. Si escribes la referéncia al texto antes que aplicar el rectángulo entonces no se verá el texto.
También puedes aplicar una imagen en lugar FillRectangle:
Código (vbnet) [Seleccionar]
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListView1.View = View.Details
ListView1.Columns.Add("Header1", 100)
ListView1.Columns.Add("Header2", 100)
ListView1.Items.Add("Item1")
ListView1.Items(0).SubItems.Add("SubItem1")
ListView1.Items.Add("Item2")
ListView1.Items(1).SubItems.Add("SubItem2")
ListView1.OwnerDraw = True
End Sub
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
'//Dibuja una imagen
Dim imagen As Image
imagen = Image.FromFile("C:\Documents and Settings\Administrador\Mis documentos\columnHeader.png")
e.Graphics.DrawImage(imagen, e.Bounds)
'//Dibuja el texto (Se superpone a los rectángulos anteriores o imagen de fondo)
Dim sf As New StringFormat()
Try
Select Case e.Header.TextAlign
Case HorizontalAlignment.Center
sf.Alignment = StringAlignment.Center
Case HorizontalAlignment.Right
sf.Alignment = StringAlignment.Far
End Select
Dim headerFont As New Font("Helvetica", 10, FontStyle.Bold)
Try
e.Graphics.DrawString(e.Header.Text, headerFont, Brushes.Black, _
New Point(e.Bounds.X + 5, e.Bounds.Y + 1), sf)
Finally
headerFont.Dispose()
End Try
Finally
sf.Dispose()
End Try
End Sub
Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
e.DrawDefault = True 'No quitar esto. A no ser que apliques una personalización para este evento. DrawDefault dibujará los valores por defecto.
End Sub
End Class