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

Vb.net 如何在空listview控件上绘制自定义消息,vb.net,listview,Vb.net,Listview,我试图编写一个继承ListView控件的自定义类。到目前为止,我已经添加了一个OnDrawItem、OnDrawSubItem和OnDrawColumnHeader事件,它允许我绕过标准windows绘图来执行一些自定义操作 我的控件几乎是我试图实现的100%,但是,最后一部分是向空的ListView控件添加自定义消息-这是我正在努力解决的问题。尽可能多地阅读,听起来我需要添加一个过程来捕获NM_CUSTOMDRAW事件并自己进行一些绘制(我可能错了)。基本上,只要我尝试绘制背景,它就会关闭列表

我试图编写一个继承ListView控件的自定义类。到目前为止,我已经添加了一个OnDrawItem、OnDrawSubItem和OnDrawColumnHeader事件,它允许我绕过标准windows绘图来执行一些自定义操作

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

由于我不太熟悉这一点,是否有人能够提供一个小例子,或提供一些信息的链接,可能能够为我走出这一步

我添加了一个调用“protectedoverridessub-WndProc(ByRef m As System.Windows.Forms.Message)”来捕获WM_NOTIFY消息,但我不确定我的方向是否正确

我希望只在后台打印一条自定义消息(当为空时),而不影响控件的任何其他绘图

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

您可以通过覆盖
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

你的方向不对。一个简单的解决方案是在listview的顶部放置一个标签,如果listview为空,则将其Visible属性设置为True。还有一个
OnPaintBackground
(和
OnPaint
),您可以在其中执行所需操作
NM_CUSTOMDRAW
不是一个事件,也不是一条消息,而是LPRAM部分,它是指向
NMLVCUSTOMDRAW
结构的指针。感谢Puropoix。你介意再详细解释一下吗?谢谢比约恩…这正是我想要的。现在唯一的问题是:1)使用listview时,designer视图变得非常混乱;2)在我移动窗口并显示列标题之前,它最初不会绘制列标题。除此之外,它工作得很好@用户2185200啊。。我没有使用列进行测试。我做了一些小改动。请看我的编辑。