我有一个只读RichTextBox
,其设置光标Arrow
。即便如此,当我将鼠标悬停它,光标闪烁,并很快切换Arrow
和IBeam
之间。我怎样才能使它留在Arrow
,而不是忽悠?
我假设这是的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;
}
吉米的回答能很好地停止闪烁,但我没有关于鼠标移动鼠标捕获一个很好的感觉。例如,一个问题,我在这个解决方案看,是如果你设置上移动鼠标捕获,然后键盘快捷键像Alt + F4键或Alt +空格键将停止工作。
我更愿意处理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);
}
}
它停止闪烁。没有一个完美的解决方案,但至少这些重要的快捷方式将继续工作。