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