我希望这是一个简单的问题。我所做的工作如下:
现在,当我将光标定位在一个小的大小框上时,光标会闪烁。我看到了调整箭头光标大小的一瞥,但大多数时候它会显示I波束光标。它不会稳定地显示箭头游标,就像将图片粘贴到WordPad并将光标放置在一个小的调整大小框上时一样。在RichTextBox中调整图片大小是否与在WordPad中的行为相同?如何阻止光标闪烁?
发布于 2018-06-20 20:47:37
使用此hack,您将能够在不闪烁的情况下调整图像的大小,并使用正确的Arrows Cursors
。
How
首先,您需要子类RichTextBox
并覆盖方法WndProc
,所以当RichTextBox
接收到消息以更改其Cursor
时,我们将检查图像是否被选中--我不知道它是否是Image
,但它是Object
而不是Text
。
如果选择了Image
,我们将message
重定向到DefWndProc
--这是默认的窗口过程。
代码:
public class RichTextBoxEx : RichTextBox
{
private const int WM_SETCURSOR = 0x20;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SETCURSOR)
{
if (SelectionType == RichTextBoxSelectionTypes.Object)
{
DefWndProc(ref m);
return;
}
}
base.WndProc(ref m);
}
}
发布于 2018-05-31 16:01:43
2018年这个问题还在发生..。
这不是最好的,但我创造了一个解决办法。我相信我们可以改进这个代码--也许在将来我会自己做。
您需要子类RichTextBox
,然后添加以下内容,以强制Cursor
达到应有的效果。
注意,对于像图片这样的对象,Cursor
要么是Cross
,要么对于文本是I-Beam
。
它的工作原理:
RichTextBox
请求更改游标(SetCursor
)时,我们都会拦截它并检查对象是否为Selected
。Cross
的游标。如果为false,则将其更改为I-Beam
。class RichTextBoxEx : RichTextBox
{
private const int WM_SETCURSOR = 0x20;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SetCursor(IntPtr hCursor);
protected override void WndProc(ref Message m) {
if (m.Msg == WM_SETCURSOR)
{
if (SelectionType == RichTextBoxSelectionTypes.Object)
{
// Necessary to avoid recursive calls
if (Cursor != Cursors.Cross)
{
Cursor = Cursors.Cross;
}
}
else
{
// Necessary to avoid recursive calls
if (Cursor != Cursors.IBeam)
{
Cursor = Cursors.IBeam;
}
}
SetCursor(Cursor.Handle);
return;
}
base.WndProc(ref m);
}
}
发布于 2015-08-31 05:31:47
使用下列属性
/// <summary>
/// The Lower property CreateParams is being used to reduce flicker
/// </summary>
protected override CreateParams CreateParams
{
get
{
const int WS_EX_COMPOSITED = 0x02000000;
var cp = base.CreateParams;
cp.ExStyle |= WS_EX_COMPOSITED;
return cp;
}
}
我已经回答了here。
https://stackoverflow.com/questions/32304388
复制相似问题