2010-02-18 69 views
4

全部,自定義列表框:優雅和有效的實現?

我目前正在研究一些ListBox自定義,以改善我的應用程序的清晰度。基本上,爲了達到這個目的,很容易找到「如何」,從而導致我目前的結果如下。

Current display http://www.freeimagehosting.net/uploads/2967c2c763.png

我很高興與顯示器,但...我面臨着鼠標滾輪奇怪的行爲。我試圖找到在這個問題上的信息,我發現這篇文章:

http://aviationxchange.net/wikis/winforms/net-color-listbox.aspx

其中指出,鼠標滾輪的問題是不是唯一的一個(從鏈接簡單的複製/粘貼)

  • 水平滾動條消失。 只有固定長度的字符串比控制寬度小 纔可以顯示 。如果控制 調整大小?
  • 如果你想使用鼠標滾輪 ,你可能已經注意到, 所選項目向上和向下移動 不穩定時,滾輪是 移動。
  • 可覆蓋的方法 OnPaint()OnPaintBackGround()不要 工作。只是他們不是 迷上了事件。背景是僅通過Windows消息繪製的 。

它提供了一些建議來糾正這些問題,但我覺得很沮喪實施所有這些「解決方法」來顯示自定義列表。我想念什麼?有沒有任何winform控件允許我進行相同類型的自定義,但採用更清晰/更優雅的方式?我無法找到更多信息:/

下面,添加了自定義繪圖部分的相關部分,但我不確定顯示問題是否真的基於overriden方法的實現,更多關於控制本身。

public RecordListBox(): base() 
    { 
     mListBox = this; 

     mListBox.DrawItem += new DrawItemEventHandler(mListBox_DrawItem); 
     mListBox.MeasureItem += new MeasureItemEventHandler(mListBox_MeasureItem); 
     this.DrawMode = DrawMode.OwnerDrawFixed; 

    } 

    public void mListBox_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (this.DesignMode) return; 

     e.DrawBackground(); 
     e.DrawFocusRectangle(); 

     // drawing actions 

    } 

    public void mListBox_MeasureItem(object sender, MeasureItemEventArgs e) 
    { 
     e.ItemHeight = 40; 
    } 

問候,

+0

爲了拿出任何形式的解決方案,我認爲我們首先需要看到您的自定義實現的源代碼,看看有什麼可以引起奇怪的行爲,你的問題是類似「我做了這個代碼,繼承人的錯誤,現在最新的錯誤呢?「除非我們能看到代碼,否則這沒有幫助。 – caesay 2010-02-18 23:59:41

回答

0

實現用戶控件是它自己的一個法寶。在您花時間開發一個完整的ListBox實現之前,您可能會更好地從第三方供應商(DevExpress,Telerik,Infragistics,ComponentOne等)購買現成的產品。他們都有在他們的主頁上提供的演示,所以你可以檢查它們是否符合你的需求。

如果你想自己實現這個,也許嘗試使用DataGridView而不是列表框。業主繪製的單元給你自由定製它們的方式。

+0

這個項目顯然是個人項目,所以我不打算爲它投入任何資金,除了我的時間。在個人範圍內,目前的結果是可以接受的。 我已經嘗試過使用DataGridView之前,但我沒有勾引渲染。最後,我將嘗試實施原始帖子中提供的鏈接中提供的建議,看看它是否解決了問題。待完成後,我會對結果進行更新。 – camous 2010-02-21 10:01:41

1

根據給出的鏈接,您必須重寫void WndProc(ref Message m)以便能夠管理鼠標滾輪問題。如果您打算基於現有的窗口對象(即使是UserControl)自定義控件,您將覆蓋許多方法和屬性以使控件確實需要。給出的鏈接看起來是一個好的開始。實現這些函數以及MeasureItem的覆蓋並查看最終結果。但是,如果你想創建一個自定義控件,那麼大部分研究都是混合在一起的,這大多隻是試驗和錯誤。

0

看起來你可以使用一個列表視圖爲你的目的。看看這個真棒自定義列表視圖:ObjectListView

0

這就是我解決鼠標滾動問題的方法。它仍然有點波濤洶涌,但比不工作好多了。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer 

'Mouse scroll bug - Yay microsoft 
    If m.Msg = &H20A Then 
     ' Trap WM_MOUSEWHEEL 
     If CType(m.WParam, Integer) > 0 Then 
      'Scroll Up 
      SendMessage(Me.Handle, 277&, 0&, vbNull) 
     Else 
      'Scroll down 
      SendMessage(Me.Handle, 277&, 1&, vbNull) 
     End If 
    End If