我试图编写一个继承ListView控件的自定义类。到目前为止,我添加了一个OnDrawItem,OnDrawSubItem和OnDrawColumnHeader事件,它允许我绕过标准的Windows绘图来做一些自定义的事情。
我的控制几乎是我想要实现的100%,但是,它的最后一部分是向一个空的ListView控件添加一个自定义消息 - 这是我正在努力的一点。尽可能多地阅读它听起来像我需要添加一个程序来捕获NM_CUSTOMDRAW事件并自己做一些绘画(我可能是错的)。基本上,一旦我尝试绘制背景,它就会关闭列表项的所有绘画。
由于我对此不太熟悉,有人能够提供一个小例子或提供一些信息的链接,这些信息可能会为我解决这个问题。
我添加了'受保护覆盖子WndProc(ByRef m As System.Windows.Forms.Message)'调用以捕获WM_NOTIFY消息,但我不确定我是否进入正确的方向。
我希望只在背景上打印自定义消息(空的时候),而不会影响控件的任何其他绘图。
这可能吗? 任何帮助将不胜感激。感谢
答案 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