首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当试图在RichTextBox中调整图像大小时游标闪烁

当试图在RichTextBox中调整图像大小时游标闪烁
EN

Stack Overflow用户
提问于 2015-08-31 05:17:06
回答 3查看 643关注 0票数 4

我希望这是一个简单的问题。我所做的工作如下:

  1. 在VS2010中,我创建了一个Windows应用程序
  2. 从“工具箱”中将RichTextBox控件拖动到窗体
  3. 窗体的大小和RichTextBox控件的大小足以显示一张小图片。
  4. 运行(开始调试)。
  5. 从web浏览器复制一个小图像并粘贴到富文本框(使用ctrl)。
  6. 在richtextbox中选择图像。使用小框显示调整帧的大小。

现在,当我将光标定位在一个小的大小框上时,光标会闪烁。我看到了调整箭头光标大小的一瞥,但大多数时候它会显示I波束光标。它不会稳定地显示箭头游标,就像将图片粘贴到WordPad并将光标放置在一个小的调整大小框上时一样。在RichTextBox中调整图片大小是否与在WordPad中的行为相同?如何阻止光标闪烁?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-20 20:47:37

使用此hack,您将能够在不闪烁的情况下调整图像的大小,并使用正确的Arrows Cursors

How

首先,您需要子类RichTextBox并覆盖方法WndProc,所以当RichTextBox接收到消息以更改其Cursor时,我们将检查图像是否被选中--我不知道它是否是Image,但它是Object而不是Text

如果选择了Image,我们将message重定向到DefWndProc --这是默认的窗口过程。

代码:

代码语言:javascript
运行
复制
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);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-05-31 16:01:43

2018年这个问题还在发生..。

这不是最好的,但我创造了一个解决办法。我相信我们可以改进这个代码--也许在将来我会自己做。

您需要子类RichTextBox,然后添加以下内容,以强制Cursor达到应有的效果。

注意,对于像图片这样的对象,Cursor要么是Cross,要么对于文本是I-Beam

它的工作原理:

  1. 每次RichTextBox请求更改游标(SetCursor)时,我们都会拦截它并检查对象是否为Selected
  2. 如果为真,则更改Cross的游标。如果为false,则将其更改为I-Beam
代码语言:javascript
运行
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-08-31 05:31:47

使用下列属性

代码语言:javascript
运行
复制
/// <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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32304388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档