如何在空listview控件上绘制自定义消息

时间:2014-02-16 00:49:10

标签: vb.net listview

我试图编写一个继承ListView控件的自定义类。到目前为止,我添加了一个OnDrawItem,OnDrawSubItem和OnDrawColumnHeader事件,它允许我绕过标准的Windows绘图来做一些自定义的事情。

我的控制几乎是我想要实现的100%,但是,它的最后一部分是向一个空的ListView控件添加一个自定义消息 - 这是我正在努力的一点。尽可能多地阅读它听起来像我需要添加一个程序来捕获NM_CUSTOMDRAW事件并自己做一些绘画(我可能是错的)。基本上,一旦我尝试绘制背景,它就会关闭列表项的所有绘画。

由于我对此不太熟悉,有人能够提供一个小例子或提供一些信息的链接,这些信息可能会为我解决这个问题。

我添加了'受保护覆盖​​子WndProc(ByRef m As System.Windows.Forms.Message)'调用以捕获WM_NOTIFY消息,但我不确定我是否进入正确的方向。

我希望只在背景上打印自定义消息(空的时候),而不会影响控件的任何其他绘图。

这可能吗? 任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:0)

您可以通过覆盖WndProc方法并检查WM_PAINT消息来实现此目的。

Public Class UIListView
    Inherits ListView

    Private Sub WmPaint(ByRef m As Message)
        MyBase.WndProc(m)
        Const text As String = "ListView is empty..."
        Using g As Graphics = Me.CreateGraphics()
            Using f As New StringFormat()
                Using b As New SolidBrush(Me.ForeColor)
                    f.Alignment = StringAlignment.Center
                    f.LineAlignment = StringAlignment.Center
                    g.DrawString(text, Me.Font, b, Me.DisplayRectangle, f)
                End Using
            End Using
        End Using
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If ((m.Msg = WM_PAINT) AndAlso (Me.Items.Count = 0)) Then
            Me.WmPaint(m)
        Else
            MyBase.WndProc(m)
        End If
    End Sub

    Private Const WM_PAINT As Integer = 15

End Class