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);
        }

    }

}

三、实现效果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733930.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MinIO 网络与覆盖网络

云计算和容器化技术的发展改变了应用程序的开发、部署和管理方式。这种转变给网络环境带来了重大变化,为DevOps和SRE工程师带来了新的挑战和机遇。然而,在这种转变中,出现了明显的知识差距,特别是在理解物理网络和硬件背景下网络的…

【免费】中国电子学会2024年03月份青少年软件编程Python等级考试试卷一级真题(含答案)

2024-03 Python一级真题 分数:100 题数:37 测试时长:60min 一、单选题(共25题,共50分) 1. 下列哪个命令,可以将2024转换成2024 呢?( A)(2分) A.str(2024) B.int(2024) C.fl…

教育培训机构寒暑假班学校公众号小程序

📚教育培训学校公众号版本:开启学习新纪元🚀 一、引言:为何教育培训学校需要公众号版本? 随着数字化时代的来临,传统教育培训行业也在不断探索新的服务模式。公众号作为新媒体平台的一种,具有信…

CentOS 7 安装部署Cassandra4.1.5

一、Cassandra的介绍 Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后&#xff0…

如何解决压缩软件无法打开文件的常见问题

压缩软件是我们日常生活和工作中常用的工具,无论是传输文件、节省存储空间还是组织数据,它们都能发挥重要作用。然而,偶尔也会遇到压缩软件无法打开文件的情况,这可能令人困惑和沮丧。本文将探讨几种常见原因,并提供解…

计算机网络(物理层)

物理层 物理层最核心的工作内容就是解决比特流在线路上传输的问题 基本概念 何为物理层?笼统的讲,就是传输比特流的。 可以着重看一下物理层主要任务的特性 传输媒体 传输媒体举例: 引导型传输媒体 引导型传输媒体指的是信号通过某种…

数字营销新玩法:拓新与裂变的完美结合

在当今这个飞速发展的数字化时代,数字营销已经成为了企业发展中至关重要的一环。拓新,简单来说就是不断去开拓新的客户群体,让更多的人了解并接触到我们的产品或服务。要做到这一点,那可得充分利用各种线上渠道。像热闹非凡的社交…

Intel太无耻,跟着玩数字游戏还揭台积电的老底,工艺都是假的

在台积电的3纳米逐渐获得芯片企业认可的情况下,近日Intel却再次指出台积电的3纳米工艺并非真正的3纳米,与Intel的7纳米工艺差不多,这显示出Intel在芯片工艺研发方面日益落后的情况下确实有点慌了。 Intel指出它的7纳米工艺的晶体管密度达到1.…

通用大模型的低代码平台——3分钟内快速搭建一个邮件提醒工具

文章目录 ⭐前言⭐node-koa开发一个发送邮件的api⭐百度智能云控制面板💖 发送邮件的组件配置💖 配置应用发布 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,通用大模型的低代码平台——3分钟内快速搭建一个智能股票分析邮件提醒工具。…

步步精:连接器领域的卓越品牌

自1987年成立以来,步步精坐落于美丽的旅游城市——温州市乐清虹桥镇,被誉为“国家电子主体生产基地”、“国家精密模具制造基地”。公司拥有7大厂区、9大事业部,800名专职员工,致力于提供高品质的连接器解决方案。注册商标“BBJCO…

力扣SQL50 查询结果的质量和占比 AVG(条件)

Problem: 1211. 查询结果的质量和占比 &#x1f468;‍&#x1f3eb; 参考题解 Code select query_name,round(avg(rating/position),2) as quality,round(100 * avg(rating < 3), 2) as poor_query_percentage from Queries group by query_name -- 到此结束过不了最后一…

【索引】数据库索引之顺序索引概述

目录 1、索引的基本概念 2、顺序索引 3、稠密索引和稀疏索引 3.1 什么是稠密索引&#xff1f; 3.2 什么是稀疏索引&#xff1f; 4、索引的更新 4.1 索引的插入操作 4.1 索引的删除操作 5、辅助索引 1、索引的基本概念 数据库中的索引与图书馆中书的索引作用相同&#xf…

echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段

功能要求 1、折线图&#xff0c;展示每天对应的一个时间片段 2、echarts Y轴展示时间片段&#xff0c;如&#xff1a;[00:00,03:00,05:15] 3、X轴展示日期&#xff0c;如&#xff1a;[xx年xx月xx日] 后端返回的数据结构&#xff0c;如 [{xAdate:"2024-06-15",data:…

汽车OTA--Flash RWW属性为什么这么重要

目录 1. OTA与RWW 1.1 FOTA需求解读 1.2 什么是RWW 2.主流OTA方案 2.1 单Bank升级 2.2 基于硬件A\B SWAP的FOTA方案 2.3 基于软件实现的FOTA方案 3.小结 1. OTA与RWW 1.1 FOTA需求解读 CP AUTOSAR R19-11首次提出了FOTA的概念&#xff0c;针对FOTA Target ECU提出了多…

《计算机英语》 Unit 3 Software Engineering 软件工程

Section A Software Engineering Methodologies 软件工程方法论 Software development is an engineering process. 软件开发是一个工程过程。 The goal of researchers in software engineering is to find principles that guide the software development process and lea…

2024年全国青少信息素养大赛python编程复赛集训第九天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

集合注意事项

目录 我们为什么要用到集合中的迭代器 List实现类的循环遍历 Set集合 HashSet TreeSet Map Hashmap Treemap Hashtable map的遍历方式 Collections的一些静态方法 我们为什么要用到集合中的迭代器 List实现类的循环遍历 如图我们对arraylist中加入了三个相同的“a”…

【软件工程】【22.04】p1

关键字&#xff1a; 软件需求规约基本性质、数据字典构成、内聚程度最高功能内聚、公有属性、RUP实体类、评审、测试序列、软件确认过程、CMMI能力等级 软件需求分类、DFD数据流图组成&#xff08;实体&#xff09;、经典详细设计、数据耦合、关联多重性、状态图、黑盒测试、…

使用ESP32和Flask框架实现温湿度数据监测系统

项目概述 在这个项目中&#xff0c;我们将使用ESP32微控制器读取温湿度传感器的数据&#xff0c;并将这些数据通过HTTP请求传输到基于Flask框架的服务器。Flask是一个轻量级的Python Web框架&#xff0c;非常适合快速开发和部署Web应用。通过这个项目&#xff0c;我们不仅可以了…

分享uniapp + Springboot3+vue3小程序项目实战

分享uniapp Springboot3vue3小程序项目实战 经过10天敲代码&#xff0c;终于从零到项目测试完成&#xff0c;一个前后端分离的小程序实战项目学习完毕 时间从6月12日 到6月22日&#xff0c;具有程序开发基础&#xff0c;第一次写uniapp,Springboot以前用过&#xff0c;VUE3也…