2010-02-18 68 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