【发布时间】:2014-04-09 15:20:18
【问题描述】:
将鼠标移到 RichTextBox(C#、.NET 4.0、WinForms)中的选定文本上时遇到奇怪的行为:当我移动鼠标光标时,它会在 Cursors.Arrow 和 Cursors.IBeam 之间闪烁。
我找到了禁用闪烁的代码:
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == WM_SETCURSOR) //WM_SETCURSOR is set to 0x20
return;
}
但随后鼠标光标卡在 Cursors.Arrow 中,即使我手动将其设置为其他内容,例如:
void RTFBox_MouseMove(object sender, MouseEventArgs e)
{
Cursor = Cursors.IBeam;
}
(我在 MouseMove 函数中也有逻辑将Cursor 设置为其他类型的非Arrow 光标,具体取决于鼠标所在的位置。)
我也试过了:
public override Cursor Cursor
{
get
{
//(I have other logic here to determine the desired cursor type I want; in all cases it was a non-Arrow cursor)
return Cursors.Cross; //'Cross' instead of 'IBeam' just to prove whether this works
}
set
{
return;
}
}
这成功地使光标成为十字(但仅当我注释掉 WndProc 代码时),但是当我将鼠标悬停在选定的文本上时闪烁仍然存在(鼠标光标在箭头和十字之间切换)。
在尝试寻找解决方案时,我遇到了this post,但致电SendMessage(Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.IBeam.Handle);
从继承自 RichTextBox 的类中没有解决闪烁问题。
我的问题似乎与this post 中描述的问题相同,但该问题被描述为存在于 .NET 3.0 中并已在 .NET 3.5 中修复。
当我创建一个新项目并在表单中插入一个 RichTextBox 时,闪烁仍然存在。
因此,我的问题是:如何防止这种闪烁?或者有谁知道这个问题是否在更高版本的 .NET/visual studio 中得到解决?
[更新:我下载了 Visual Studio 2013,但“闪烁”效果仍然存在。我下载了 .Net 4.5.1 安装程序并告诉它修复,但“闪烁”仍然存在。在“属性”>“参考”下,它说“System.Windows.Forms”是版本 4.0.0.0;我想这意味着没有必要更新 4.0 以上的版本?]
【问题讨论】:
标签: c# .net winforms richtextbox