当光标出现在项目上时,我正在尝试更改标准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属性并说“只设置为默认值或没有游标”,这也不起作用。
任何帮助都表示赞赏。
伊恩
答案 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,看看是否有帮助。