ListView光标更改&闪烁

时间:2009-02-27 10:04:04

标签: c# .net winforms listview

当光标出现在项目上时,我正在尝试更改标准ListView上显示的光标。然而,当鼠标变为手指光标,然后回到我要求的状态时,我会产生闪烁效果。

我正在尝试将此闪烁/更改为手形光标,但无法确定它发生的位置或如何停止它。要复制这个......

1)创建一个带有ListView的表单。 2)添加图像列表和一些图像。将视图设置为大图标模式。 3)将一些项添加到ListView。

MouseMove个事件添加到ListView

private void listView1_MouseMove(object sender, MouseEventArgs e)
{
    ListViewItem selected = this.listView1.GetItemAt(e.X, e.Y);
    if (selected == null)
    {
        base.Cursor = Cursors.Default;
    }
    else
    {
        base.Cursor = Cursors.No;
    }
}

执行应用程序,将鼠标移到项目上。当您在项目上方时,您应该看到光标在No(无条目光标)和手指指针之间闪烁。问题是如何确保它只显示无光标和不闪烁。 (C#.NET)。

我已经尝试覆盖OnMouseMove和OnMouseHover以返回以确保它们不会设置任何内容。我也尝试重写Cursor属性并说“只设置为默认值或没有游标”,这也不起作用。

任何帮助都表示赞赏。

伊恩

2 个答案:

答案 0 :(得分:8)

问题是C#ListView Control基本上是Windows List View Control的包装器。因此,当我们将光标设置为Arrow时,底层列表视图控件始终默认为手形光标,而我们在C#ListView类中的设置则希望它为箭头。这就是为什么我们得到那种闪烁,因为潜在的控制又回到了手。

以下是您需要添加的代码:

public const uint LVM_SETHOTCURSOR = 4158;

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

SendMessage(listView1.Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.Arrow.Handle);

从Form的onLoad事件中调用SendMessage非常重要,因为那时底层的ListView控件已完全初始化!

实际上很简单,祝你有美好的一天! :)

答案 1 :(得分:0)

如果没有尝试过,游标通常会根据WM_ SETCURSOR进行更改,因此可能与ListView的默认WM_ SETCURSOR处理冲突。我会尝试创建一个从ListView派生的新UserControl,然后在WndProc中捕获WM_ SETCURSOR,看看是否有帮助。