Bootstrap

C# 实现去除多行文本框光标闪烁,并设置行距

一、前言

   本篇主要通过继承RichTextBox 的方式实现去除多行文本框的光标闪烁,以及能够设置行距大小,这是因为C#提供的TextBox 和 RichTextBox 本身无这样的功能

二、代码

    封装 RichTextBox 为CustomTextBox

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace testRichTextBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load_1(object sender, EventArgs e)
        {
            CustomTextBox textBox;
            textBox = new CustomTextBox();
            int side = 10;
            textBox.Location = new Point(  side,   side);
            textBox.Size = new Size((int)(640-3.5*side), (int)(480- 6 * side) );

            textBox.Text = "人工智能简介\n" +
                           "  人工智能(Artificial Intelligence,简称 AI)是一门研究和开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新兴学科。它涉及计算机科学、数学、认知科学、心理学、神经科学、语言学等多个领域。其目标是让机器具备感知、学习、推理和决策能力,从而在特定任务中表现出类似人类的智能行为。\n"+

                           "  近年来,人工智能取得了令人瞩目的进展,尤其是在机器学习和深度学习领域。机器学习通过算法分析大量数据,发现潜在模式并做出预测或决策,而深度学习则通过多层神经网络模拟人脑的工作方式,特别擅长处理图像、声音和语言等复杂任务。从自动驾驶汽车到语音助手,从医疗诊断到金融分析,AI 技术正在广泛应用于各行各业,提高生产力和生活质量。\n" +

                           "  然而,人工智能的发展也伴随着诸多挑战和争议。技术层面上,AI 系统在数据质量、算法鲁棒性和伦理问题上仍有待提升。社会层面上,人工智能的普及可能导致就业结构变化,引发经济不平等和隐私保护等问题。此外,随着 AI 技术的不断演进,人们对其潜在威胁的担忧也日益增加,包括自主武器和超级智能等话题。如何在推动技术进步的同时,确保其安全和可控,是当前亟需解决的问题。\n" +

                           "  为了应对这些挑战,全球各地的研究机构、政府和企业正积极合作,制定相关的标准和政策,确保人工智能技术能够负责任地发展。例如,许多国家已经出台了 AI 发展战略,强调技术研发和应用中的伦理规范,并倡导透明、公正和可解释性。这些举措旨在最大程度地发挥人工智能的潜力,同时防范其可能带来的负面影响。\n" +

                           "  展望未来,人工智能有望在更多领域实现突破,进一步改变我们的生活和工作方式。随着计算能力的提升和算法的优化,AI 系统将在更加复杂和动态的环境中表现出更强的适应性和智能性。从智慧城市建设到个性化教育,从精准医疗到环境保护,人工智能将成为推动社会进步的重要力量。只有在技术创新与伦理思考并重的前提下,我们才能迎接一个更加智能和美好的未来。\n";  // ;
            textBox.ForeColor = Color.Black;
            textBox.BackColor = Color.FromArgb(255, 255, 255);
            textBox.Font = new Font("宋体", 11, FontStyle.Regular);
            textBox.Multiline = true;
             textBox.Anchor = AnchorStyles.Top;

            textBox.SetReadMode();  //禁止光标闪烁,并且设置为仅仅可读

            // 将 CustomTextBox 添加到窗体中
            this.Controls.Add(textBox);

        }
    }

    public class CustomTextBox : RichTextBox
    {
        // 下面是用于在构造函数设置行距 
        public const int WM_USER = 0x0400;
        public const int EM_GETPARAFORMAT = WM_USER + 61;
        public const int EM_SETPARAFORMAT = WM_USER + 71;
        public const long MAX_TAB_STOPS = 32;
        public const uint PFM_LINESPACING = 0x00000100;
        [StructLayout(LayoutKind.Sequential)]

        private struct PARAFORMAT2
        {
            public int cbSize;
            public uint dwMask;
            public short wNumbering;
            public short wReserved;
            public int dxStartIndent;
            public int dxRightIndent;
            public int dxOffset;
            public short wAlignment;
            public short cTabCount;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public int[] rgxTabs;
            public int dySpaceBefore;
            public int dySpaceAfter;
            public int dyLineSpacing;
            public short sStyle;
            public byte bLineSpacingRule;
            public byte bOutlineLevel;
            public short wShadingWeight;
            public short wShadingStyle;
            public short wNumberingStart;
            public short wNumberingStyle;
            public short wNumberingTab;
            public short wBorderSpace;
            public short wBorderWidth;
            public short wBorders;
        }

        [DllImport("user32", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref PARAFORMAT2 lParam);

        //下面是禁止光标闪烁
        [DllImport("user32.dll")]
        static extern bool HideCaret(IntPtr hWnd);

        private bool bReadOnly = false;
        public void SetReadMode()
        {
            ReadOnly = true;
            bReadOnly = true;
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (bReadOnly)
                HideCaret(Handle);
        }

        public CustomTextBox()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.Transparent;
            BorderStyle = BorderStyle.None;

            this.Multiline = true; // 设置为多行文本框
            this.ScrollBars = RichTextBoxScrollBars.Vertical; // 垂直滚动条

            // 设置默认字体颜色和背景颜色,确保它们不同
            this.ForeColor = Color.Black;
            this.BackColor = Color.White;

            //设置行距
            PARAFORMAT2 fmt = new PARAFORMAT2();
            fmt.cbSize = Marshal.SizeOf(fmt);
            fmt.bLineSpacingRule = 4;
            fmt.dyLineSpacing = 40 * (7 + 5);  // 设置行距呀,40 * (9 + 3);//((int)richTextBox1.Font.Size) * 20 * ((int)ud.Value);
            fmt.dwMask = PFM_LINESPACING;
            SendMessage(new HandleRef(this, this.Handle), EM_SETPARAFORMAT, 0, ref fmt);
        }

    }

}

三、实现效果

    去除多行文本框的光标闪烁,以及能够设置行距大小,这样看起来就更为美观简洁,如果只是用于显示多行文字。

;