2009-02-27 162 views
4

我试图改变光标出现在标准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(没有输入光标)和手指指针之间闪烁。问题是如何确保它只显示No游标并且不闪烁。 (C#.NET)。

我试着重写OnMouseMove和OnMouseHover来返回,以确保这些不设置任何东西。我也尝试覆盖Cursor属性,并说'只设置为默认或没有游标',也没有工作。

任何帮助的赞赏。

伊恩

+0

它发生在其他地方吗?例如,在超链接或其他应用程序中导航时?或者它只在你的应用程序中发生? 如果是这样,它可能更多是一个操作系统问题... – Razzie 2009-02-27 10:49:34

+0

它是跨平台,跨应用程序。如果你阅读我的评论teknohippy ...这个问题被夸大手工绘制物品和hottracking。我试过覆盖WndProc返回,如果(m.Msg == 0x020)改变光标。有些东西将它切换到一只手,但我不确定是什么。 – Ian 2009-02-27 11:12:54

回答

7

问题是,C#ListView控件基本上是Windows列表视图控件的一个包装。因此,当我们将光标设置为箭头时,基础列表视图控件总是默认为手形光标,而我们在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); 

这是非常重要的,你因为届时基础ListView控件是完全初始化从表格的onLoad事件调用SendMessage函数!

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

0

,而不必试了一下,光标响应WM_正常的setCursor改变,也许你在使用默认WM_处理的setCursor ListView中的冲突。我会尝试创建一个从ListView派生的新UserControl,然后在WndProc中捕获WM_ SETCURSOR并查看是否有帮助。