自定义列表框:优雅&有效实施?

时间:2010-02-18 22:09:03

标签: c# winforms listbox custom-controls

所有

我正在进行一些ListBox自定义,以提高我的应用程序的清晰度。基本上,很容易找到“如何”为此目的导致我目前的结果如下。

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

我对显示器很满意但是...我用鼠标滚轮遇到了奇怪的行为。我试图找到有关这个问题的信息,我发现了这篇文章:

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

指出鼠标问题不是唯一的问题(从链接中简单复制/粘贴)

  • 水平滚动条消失了。 只有固定长度的字符串更小 比控制宽度还可以 显示。如果控制怎么办 调整大小?
  • 如果您尝试使用鼠标 轮子,你可能已经注意到了 所选项目上下移动 滚轮是不正常的 移动。
  • 可覆盖的方法 OnPaint()OnPaintBackGround()没有 工作。只是他们不是 迷上了这些事件。背景是 仅通过Windows消息绘制。

它提供了一些纠正这些问题的建议,但我觉得实施所有这些“解决方法”以显示自定义列表感到非常沮丧。我错过了什么吗?是否有任何winform控件允许我进行相同类型的自定义,但是更干净/更优雅?我无法找到更多信息:/

下面,添加了自定义绘图部分的相关部分,但我不确定显示问题是否真的基于覆盖方法的实现,更多的是基于控件本身。

    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;
    }

此致

4 个答案:

答案 0 :(得分:1)

根据给定的链接,您必须覆盖void WndProc(ref Message m)才能管理鼠标滚轮问题。如果要基于现有的窗口对象(甚至是UserControl)滚动自己的自定义控件,您将覆盖许多方法和属性,以使控件真正想要您想要的。给出的链接似乎是一个良好的开端。实现这些功能以及MeasureItem的覆盖,并查看最终结果。但是,如果你想创建一个自定义控件,那么大多数只是试验和错误,并且混入很多研究。

答案 1 :(得分:0)

实现用户控件本身就是一种魔力。在您花时间开发完整的ListBox实现之前,您最好从第三方供应商(DevExpress,Telerik,Infragistics,ComponentOne等)购买一个现成的产品。他们都在他们的主页上提供了演示,因此您可以检查它们是否符合您的需求。

如果您想自己实现,可以尝试使用DataGridView而不是列表框。所有者绘制的单元格使您可以自由地以各种可能的方式自定义它们。

答案 2 :(得分:0)

您似乎可以将listview用于您的目的。看看这个很棒的自定义列表视图:ObjectListView

答案 3 :(得分: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
相关问题