一、前言
本篇主要通过继承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);}}}
三、实现效果
去除多行文本框的光标闪烁,以及能够设置行距大小,这样看起来就更为美观简洁,如果只是用于显示多行文字。