所有
我正在进行一些ListBox自定义,以提高我的应用程序的清晰度。基本上,很容易找到“如何”为此目的导致我目前的结果如下。
Current display http://www.freeimagehosting.net/uploads/2967c2c763.png
我对显示器很满意但是...我用鼠标滚轮遇到了奇怪的行为。我试图找到有关这个问题的信息,我发现了这篇文章:
http://aviationxchange.net/wikis/winforms/net-color-listbox.aspx
指出鼠标问题不是唯一的问题(从链接中简单复制/粘贴)
它提供了一些纠正这些问题的建议,但我觉得实施所有这些“解决方法”以显示自定义列表感到非常沮丧。我错过了什么吗?是否有任何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;
}
此致
答案 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