2014-02-16 58 views
2

我試圖編寫一個繼承ListView控件的自定義類。到目前爲止,我已經添加了一個OnDrawItem,OnDrawSubItem和OnDrawColumnHeader事件,它允許我繞過標準的Windows繪圖來做一些自定義的事情。如何在空列表視圖控件上繪製自定義消息

我的控件幾乎是我試圖實現的100%,但是,它的最後一部分是將自定義消息添加到空的ListView控件 - 這是我努力的一點。儘可能多地讀取它,聽起來像我需要添加一個過程來捕獲NM_CUSTOMDRAW事件並自己做一些繪畫(我可能是錯的)。基本上,只要我嘗試繪製背景,就會關閉列表項的所有繪畫。

由於我對此不是很熟悉,有人能夠提供一個小例子或提供一些信息的鏈接,這些信息可以幫助我解決這個問題。

我添加了一個「受保護的覆蓋子的WndProc(爲ByRef米作爲System.Windows.Forms.Message)」呼叫捕捉WM_NOTIFY消息,但我不知道如果我在正確的方向我要去。

我希望只是在背景(空時)上打印自定義消息而不影響控件的其他繪圖。

這可能嗎? 任何幫助將不勝感激。謝謝

+0

你不是朝着正確的方向前進。一個簡單的解決方案是將標籤放在列表視圖的頂部,如果列表視圖爲空,則將其可見屬性設置爲True。 –

+0

還有一個'OnPaintBackground'(和'OnPaint'),你可以在那裏做你想做的事。 'NM_CUSTOMDRAW'不是一個事件,也不是一個消息,而是一個指向NMLVCUSTOMDRAW結構的lParam部分。 – Plutonix

+0

感謝Plutonix。你介意再詳述一下嗎? – Riples

回答

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 
+0

謝謝比約恩......那正是我想要的。現在唯一的問題是1)使用listview時,設計器視圖變得非常棘手,並且2)在我移動窗口然後顯示之前,它並沒有繪製列標題。除此之外,效果很好! – Riples

+0

@ user2185200啊..我沒有測試列。我做了一些小改動。請參閱我的編輯。 –