首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在c#中禁用richtextbox中的自动滚动

如何在c#中禁用richtextbox中的自动滚动
EN

Stack Overflow用户
提问于 2013-06-20 21:13:11
回答 2查看 1.2K关注 0票数 0

我想在c#中禁用richtextbox的滚动功能。我只想让richtextbox让用户只在它的大小区域输入,这意味着用户没有垂直滚动。就像MS-word或提前打开Office Pages.thanx一样。

EN

回答 2

Stack Overflow用户

发布于 2015-01-24 22:22:17

这对我很有效。

正如你可能在其他帖子中看到的,首先你需要从C#访问user32.dll

代码语言:javascript
运行
复制
[System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);


    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int SendMessage(IntPtr hwndLock,Int32 wMsg,Int32 wParam, ref Point pt);

我们需要做一些常量声明来正确地调用SendMessage

代码语言:javascript
运行
复制
private const int WM_USER = 0x400;
private const int EM_HIDESELECTION = WM_USER + 63;
private const int WM_SETREDRAW = 0x000B;
private const int EM_GETSCROLLPOS = WM_USER + 221;
private const int EM_SETSCROLLPOS = WM_USER + 222;

然后,当我们需要停止滚动时,可以使用一些公共静态方法。

代码语言:javascript
运行
复制
    public static void Suspend(Control control)
    {
        Message msgSuspendUpdate = Message.Create(control.Handle, WM_SETREDRAW, IntPtr.Zero,
            IntPtr.Zero);

        NativeWindow window = NativeWindow.FromHandle(control.Handle);
        window.DefWndProc(ref msgSuspendUpdate);
    }

    public static void Resume(Control control)
    {
        // Create a C "true" boolean as an IntPtr
        IntPtr wparam = new IntPtr(1);
        Message msgResumeUpdate = Message.Create(control.Handle, WM_SETREDRAW, wparam,
            IntPtr.Zero);

        NativeWindow window = NativeWindow.FromHandle(control.Handle);
        window.DefWndProc(ref msgResumeUpdate);

        control.Invalidate();
    }


    public static Point GetScrollPoint(Control control) {
        Point point = new Point();
        SendMessage(control.Handle, EM_GETSCROLLPOS, 0, ref point);
        return point;
    }

    public static void SetScrollPoint(Control control, Point point)
    {
        SendMessage(control.Handle, EM_SETSCROLLPOS, 0, ref point);

    }

Suspend方法停止控件,以便在屏幕上进行重绘。Resume方法restarts在给定控件的屏幕上重新绘制。

GetScrollPoint方法获取滚动插入符号所在的实际PointSetScrollPoint将滚动插入符号放在给定的处。

如何使用这些方法?首先,给定一个恢复控件,您需要停止自动滚动,调用Suspend,然后调用(对控件执行所需的操作,如突出显示或追加文本),然后是SetScrollPoint,最后是Resume

在我的例子中,我希望在光标从一行移动到另一行的任何时候复制RichTextBox的整行。(这样做会在长行上产生一个滚动条)。

这是我的工作方法:

代码语言:javascript
运行
复制
    private int intLastLine = -1;
    private void richTextBoxSwitch_SelectionChanged(object sender, EventArgs e)
    {
        try
        {
            if (this.richTextBoxSwitch.TextLength > 0)
            {
                ControlBehavior.Suspend(this.richTextBoxSwitch);
                Point point = ControlBehavior.GetScrollPoint(this.richTextBoxSwitch);
                int intSelectionStartBackup = this.richTextBoxSwitch.SelectionStart;
                int intSelectionLengthBackup = this.richTextBoxSwitch.SelectionLength;

                int intCharIndex = this.richTextBoxSwitch.GetFirstCharIndexOfCurrentLine();
                int intLine = this.richTextBoxSwitch.GetLineFromCharIndex(intCharIndex);

                this.richTextBoxSwitch.SuspendLayout();
                if (intLastLine != intLine)
                {
                    intLastLine = intLine;
                    int intLength = this.richTextBoxSwitch.Lines[intLine].Length;
                    this.richTextBoxSwitch.Select(intCharIndex, intLength);
                    this.richTextBoxSwitch.BackColor = ColorMessageBackground;
                    strData = this.richTextBoxSwitch.SelectedText;
                    this.textBoxMessageSelected.Text = strData.Trim();
                    this.richTextBoxSwitch.Select(intSelectionStartBackup, intSelectionLengthBackup);
                }
                this.richTextBoxSwitch.ResumeLayout();
                ControlBehavior.SetScrollPoint(this.richTextBoxSwitch, point);
                ControlBehavior.Resume(this.richTextBoxSwitch);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 22:32:09

您应该覆盖WndProc并阻止WM_SETFOCUS

代码语言:javascript
运行
复制
protected override void WndProc(ref Message m)
{
    if(m.Msg != WM_SETFOCUS)
        base.WndProc(ref m);
}

这里有一个关于这方面的教程:How to: C# - Prevent RichTextBox from auto scrolling

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

https://stackoverflow.com/questions/17214602

复制
相关文章

相似问题

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