我有一个只读的RichTextBox
,其光标设置为Arrow
。即使如此,当我将其悬停时,光标也会闪烁,并在Arrow
和IBeam
之间非常快速地切换。如何使它停留在Arrow
上而不闪烁?
答案 0 :(得分:2)
我假设这是WinForms RichTextBox,因为WPF没有这个问题。
RichTextBox处理WM_SETCURSOR
消息,如果鼠标指针最终出现在链接上,则将光标更改为Cursors.Hand
。开发人员的说明:
RichTextBox通过链接上的
WM_SETCURSOR
消息使我们能够 将光标更改为手。它通过同步来做到这一点 通知消息。所以我们必须将消息传递给DefWndProc 首先,然后,如果我们在此期间收到通知消息 (通过更改“ LinkCursor”表示,我们将其设置为手形。否则, 我们在控件上调用WM_SETCURSOR
实现,将其设置为 用户对RichTextBox光标的选择。
您可以在鼠标进入控件的边界时设置捕获,然后在鼠标指针离开该区域时释放它。否则需要释放捕获,否则,当您第一次单击另一个控件时,光标将改为设置为RichTextBox:
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
if (!richTextBox1.ClientRectangle.Contains(e.Location))
{
richTextBox1.Capture = false;
}
else if (!richTextBox1.Capture)
richTextBox1.Capture = true;
}
答案 1 :(得分:2)
Jimi的答案可以很好地阻止闪烁,但是我对在鼠标移动时捕获鼠标没有很好的感觉。例如,我在该解决方案中看到的一个问题是,如果您将捕获设置为鼠标移动,然后设置键盘快捷键,例如 Alt + F4 或 Alt + Space 将停止工作。
我希望处理WndProc
并在收到WM_SETCURSOR
时设置光标:
using System.Windows.Forms;
public class ExRichTextBox : RichTextBox
{
const int WM_SETCURSOR = 0x0020;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SETCURSOR)
Cursor.Current = this.Cursor;
else
base.WndProc(ref m);
}
}
它停止闪烁。这不是一个完美的解决方案,但至少那些重要的快捷方式将继续起作用。