Winform RichTextBox 使用记录

字体设为宋体,但输入字母仍变为为Arial字体

设置RichTextBox.LanguageOption的值即可,好像无论设置哪个值都可以统一字体

RichTextBox.WordWrap = false; 禁止自动换行
RichTextBox.DetectUrls = false; 禁止网址链接
RichTextBox.HideSelection = false; 保持丢失焦点后选择状态

c# RichTextBox 闪烁怎么解决

在Windows Forms应用程序中,RichTextBox控件在更新内容时可能会出现闪烁现象。这种闪烁通常是由于控件被频繁重绘引起的。为了解决RichTextBox闪烁问题,可以采取以下几种常见的方法:

1. 双缓冲技术

双缓冲是一种通过在后台进行绘制并将最终的图像一次性显示出来的技术,以减少屏幕闪烁。

对于自定义控件,可以通过设置控件的DoubleBuffered属性来启用双缓冲。然而,RichTextBox并不直接支持该属性,因此我们需要通过创建继承自RichTextBox的自定义控件来实现双缓冲。

2. 设置控件样式

可以通过SetStyle方法将控件的双缓冲和减少闪烁的样式进行组合应用。

3. 暂停重绘

通过挂起重绘和恢复重绘来减少闪烁。可以使用Win32 API进行控制。

下面是如何实施上述方法的示例代码:

方法1:自定义控件实现双缓冲

无效果

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace RichTextBoxExample
{
    public class BufferedRichTextBox : RichTextBox
    {
        public BufferedRichTextBox()
        {
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
            UpdateStyles();
        }
    }
    
    public class MainForm : Form
    {
        private BufferedRichTextBox richTextBox;

        public MainForm()
        {
            InitializeComponent();
            InitializeRichTextBox();
        }

        private void InitializeComponent()
        {
            this.Text = "Buffered RichTextBox Example";
            this.Size = new System.Drawing.Size(800, 600);
        }

        private void InitializeRichTextBox()
        {
            richTextBox = new BufferedRichTextBox
            {
                Dock = DockStyle.Fill
            };
            this.Controls.Add(richTextBox);

            // 向RichTextBox添加一些示例文本
            for (int i = 0; i < 100; i++)
            {
                richTextBox.AppendText($"Line {i}{Environment.NewLine}");
            }
        }

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

方法2:挂起和恢复重绘(使用Win32 API)

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace RichTextBoxExample
{
    public class MainForm : Form
    {
        private RichTextBox richTextBox;

        public MainForm()
        {
            InitializeComponent();
            InitializeRichTextBox();
        }

        private void InitializeComponent()
        {
            this.Text = "RichTextBox with Suspend/Resume Painting Example";
            this.Size = new System.Drawing.Size(800, 600);
        }

        private void InitializeRichTextBox()
        {
            richTextBox = new RichTextBox
            {
                Dock = DockStyle.Fill
            };
            this.Controls.Add(richTextBox);

            // 添加示例文本并挂起重绘
            SuspendDrawing(richTextBox);
            for (int i = 0; i < 100; i++)
            {
                richTextBox.AppendText($"Line {i}{Environment.NewLine}");
            }
            ResumeDrawing(richTextBox);
        }

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int wMsg, bool wParam, int lParam);

        private const int WM_SETREDRAW = 0x0B;

        public static void SuspendDrawing(Control parent)
        {
            SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
        }

        public static void ResumeDrawing(Control parent)
        {
            SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
            parent.Refresh();
        }

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

方法解析

  1. 双缓冲技术

    • RichTextBox控件包装在一个自定义控件中,并启用双缓冲选项来减少闪烁。
  2. 挂起和恢复重绘

    • 使用Win32 API SendMessage 函数暂停控件的重绘,并在所有更新完成后恢复重绘。通过挂起和恢复重绘,减少控件被频繁重绘的次数,可以显著减少闪烁。
  3. 设置控件样式

    • 配置控件样式来直接应用优化的绘制设置。

以上方法可以单独或组合使用,视具体情况而定。通常来说,双缓冲和挂起/恢复重绘是解决闪烁问题的有效手段。

posted @   DyanBlog  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示