C# 重写RichTextBox带行号和下划线 效果如下

有几个关键点需要注意:

1,闪屏的问题

public UserRichTextBox()
        {
           //其它的不需要,只需要设置如下
            //获取或设置一个值,该值指示控件在调整大小时是否重绘自己。
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            //为用户控制启用双缓冲等控件样式
            this.SetStyle(ControlStyles.DoubleBuffer, true);// 双缓冲
            this.UpdateStyles();//这个也可以注释
            InitializeComponent();
        }

2,背景透明设置

public class AlphaRichTextBox : RichTextBox
    {
        //关键点:支持透明背景  
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x020;
                return cp;
            }
        }
       
        
    }

3,源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WinFmnotepad
{public partial class UserRichTextBox : UserControl{public UserRichTextBox(){//获取或设置一个值,该值指示控件在调整大小时是否重绘自己。this.SetStyle(ControlStyles.ResizeRedraw, true);//为用户控制启用双缓冲等控件样式this.SetStyle(ControlStyles.DoubleBuffer, true);// 双缓冲this.UpdateStyles();InitializeComponent();}protected override void OnLoad(EventArgs e){base.OnLoad(e);}private void showLineNo(){//获得当前坐标信息Point p = this.alphaRichTextBox1.Location;int crntFirstIndex = this.alphaRichTextBox1.GetCharIndexFromPosition(p);int crntFirstLine = this.alphaRichTextBox1.GetLineFromCharIndex(crntFirstIndex);Point crntFirstPos = this.alphaRichTextBox1.GetPositionFromCharIndex(crntFirstIndex);p.Y += this.alphaRichTextBox1.Height;int crntLastIndex = this.alphaRichTextBox1.GetCharIndexFromPosition(p);int crntLastLine = this.alphaRichTextBox1.GetLineFromCharIndex(crntLastIndex);Point crntLastPos = this.alphaRichTextBox1.GetPositionFromCharIndex(crntLastIndex);//准备画图Graphics g = this.panel1.CreateGraphics();Font font = new Font(this.alphaRichTextBox1.Font, this.alphaRichTextBox1.Font.Style);SolidBrush brush = new SolidBrush(Color.Green);//画图开始//刷新画布Rectangle rect = this.panel1.ClientRectangle;brush.Color = this.panel1.BackColor;g.FillRectangle(brush, 0, 0, this.panel1.ClientRectangle.Width, this.panel1.ClientRectangle.Height);brush.Color = Color.White;//重置画笔颜色//绘制行号int lineSpace = 0;if (crntFirstLine != crntLastLine){lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);}else{lineSpace = Convert.ToInt32(this.alphaRichTextBox1.Font.Size);}int brushX = this.panel1.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);int brushY = crntLastPos.Y + Convert.ToInt32(font.Size * 0.21f);for (int i = crntLastLine; i >= crntFirstLine; i--){g.DrawString((i + 1).ToString(), font, brush, brushX, brushY);brushY -= lineSpace;}g.Dispose();font.Dispose();brush.Dispose();}private void alphaRichTextBox1_TextChanged(object sender, EventArgs e){showLineNo();}private void alphaRichTextBox1_Resize(object sender, EventArgs e){showLineNo();alphaRichTextBox1_lines();}private void alphaRichTextBox1_FontChanged(object sender, EventArgs e){showLineNo();alphaRichTextBox1_lines();}private void alphaRichTextBox1_Enter(object sender, EventArgs e){showLineNo();alphaRichTextBox1_lines();}private void alphaRichTextBox1_SizeChanged(object sender, EventArgs e){showLineNo();alphaRichTextBox1_lines();}private void alphaRichTextBox1_VScroll(object sender, EventArgs e){ // showLineNo();// alphaRichTextBox1_lines();}private void alphaRichTextBox1_lines(){//获得当前坐标信息Point p = new Point(0,0); //this.alphaRichTextBox1.Location;int crntFirstIndex = this.alphaRichTextBox1.GetCharIndexFromPosition(p);int crntFirstLine = this.alphaRichTextBox1.GetLineFromCharIndex(crntFirstIndex);Point crntFirstPos = this.alphaRichTextBox1.GetPositionFromCharIndex(crntFirstIndex);p.Y += this.alphaRichTextBox1.Height;int crntLastIndex = this.alphaRichTextBox1.GetCharIndexFromPosition(p);int crntLastLine = this.alphaRichTextBox1.GetLineFromCharIndex(crntLastIndex);Point crntLastPos = this.alphaRichTextBox1.GetPositionFromCharIndex(crntLastIndex);//准备画图Graphics g = this.alphaRichTextBox1.CreateGraphics();Font font = new Font(this.alphaRichTextBox1.Font, this.alphaRichTextBox1.Font.Style);SolidBrush brush = new SolidBrush(Color.Green);//画图开始//刷新画布Rectangle rect = this.alphaRichTextBox1.ClientRectangle;brush.Color = this.alphaRichTextBox1.BackColor;g.FillRectangle(brush, 0, 0, this.alphaRichTextBox1.ClientRectangle.Width, this.alphaRichTextBox1.ClientRectangle.Height);brush.Color = Color.White;//重置画笔颜色Pen pen = new Pen(System.Drawing.Color.DarkGray, 1);//绘制行int lineSpace = 0;if (crntFirstLine != crntLastLine){lineSpace = (crntLastPos.Y - crntFirstPos.Y) / (crntLastLine - crntFirstLine);}else{lineSpace = font.Height;}int brushX = this.panel1.ClientRectangle.Width - Convert.ToInt32(font.Size * 3);// int brushY = crntLastPos.Y + Convert.ToInt32(font.Size * 0.21f);int brushY =0;if (crntLastPos.Y + font.Height > font.Size){brushY = crntLastPos.Y + font.Height;}else {brushY =font.Height;}for (int i = crntLastLine; i >= crntFirstLine; i--){g.DrawLine(pen, new Point(0,brushY), new Point(this.alphaRichTextBox1.ClientRectangle.Width, brushY));brushY -= lineSpace;}g.Dispose();font.Dispose();brush.Dispose();alphaRichTextBox1.Invalidate();//刷新  要是只有这句话 还要重写OnPaint方法//alphaRichTextBox1.Update();// alphaRichTextBox1.Refresh();}protected override void OnPaint(PaintEventArgs e)//重写 {showLineNo();alphaRichTextBox1_lines();base.OnPaint(e);}#region 键盘键释放后发生//定义委托public delegate void alpha_KeyUp(object sender, EventArgs e);//定义事件public event alpha_KeyUp UserControl_KeyUp;public void alphaRichTextBox1_KeyUp(object sender, KeyEventArgs e){if (UserControl_KeyUp != null){UserControl_KeyUp(sender, e);}}#endregion#region 回车时发生//定义委托public delegate void alpha_Enter(object sender, EventArgs e);//定义事件public event alpha_Enter UserControl_Enter;private void UserRichTextBox_Enter(object sender, EventArgs e){if (UserControl_Enter != null){UserControl_Enter(sender, e);}}#endregion#region 按下鼠标键时发生//定义委托public delegate void alpha_MouseDown(object sender, MouseEventArgs e);//定义事件public event alpha_MouseDown UserControl_MouseDown;private void alphaRichTextBox1_MouseDown(object sender, MouseEventArgs e){if (UserControl_MouseDown != null){UserControl_MouseDown(sender, e);}}#endregion#region 鼠标单击时发生//定义委托public delegate void alpha_MouseClick(object sender, MouseEventArgs e);//定义事件public event alpha_MouseClick UserControl_MouseClick;private void alphaRichTextBox1_MouseClick(object sender, MouseEventArgs e){if (UserControl_MouseClick != null){UserControl_MouseClick(sender, e);}}#endregion#region 右键菜单//全选private void ALLselectTSMItem_Click(object sender, EventArgs e){this.contextMenuStrip1.SourceControl.Select();RichTextBox rtb = (RichTextBox)this.contextMenuStrip1.SourceControl;rtb.SelectAll();}//剪切private void CutTSMItem_Click(object sender, EventArgs e){this.contextMenuStrip1.SourceControl.Select();RichTextBox rtb = (RichTextBox)this.contextMenuStrip1.SourceControl;rtb.Cut();}//复制private void CopyTSMItem_Click(object sender, EventArgs e){this.contextMenuStrip1.SourceControl.Select(); // 先获取焦点,防止点两下才运行RichTextBox rtb = (RichTextBox)this.contextMenuStrip1.SourceControl;rtb.Copy();}//粘贴private void PasteTSMItem_Click(object sender, EventArgs e){this.contextMenuStrip1.SourceControl.Select();RichTextBox rtb = (RichTextBox)this.contextMenuStrip1.SourceControl;rtb.Paste();}//撤消private void UndoTSMItem_Click(object sender, EventArgs e){this.contextMenuStrip1.SourceControl.Select();RichTextBox rtb = (RichTextBox)this.contextMenuStrip1.SourceControl;rtb.Undo();}//删除private void DelTSMItem_Click(object sender, EventArgs e){this.contextMenuStrip1.SourceControl.Select();RichTextBox rtb = (RichTextBox)this.contextMenuStrip1.SourceControl;rtb.SelectedText = "";}#endregion}public class AlphaRichTextBox : RichTextBox{//关键点:支持透明背景  protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= 0x020;return cp;}}}}

C# 重写RichTextBox带行号和下划线相关推荐

  1. IO流 带行号的缓冲区

    package com.yyq; import java.io.*; /** 装饰类(带行号的装饰类)*/ public class LineNumberReaderDemo {public stat ...

  2. photoshop将图层导出到文件脚本不带数字序号、下划线方法

    photoshop将图层导出到文件脚本不带数字序号.下划线方法 这段时间一直在ps中批量处理图片,有时需要将每个图层里的图片分别导出到jpg或其它格式的图片,如果用ps自带的"将图层导出到文 ...

  3. html代码高亮带行号,无法解决的难题:代码高亮插件SyntaxHighlighter Evolved的行号问题...

    WordPress 的 SyntaxHighlighter Evolved 是一个可以高亮显示代码的插件,它使用方便,界面也非常好看,很适合技术博客使用. SyntaxHighlighter Evol ...

  4. html代码高亮带行号,kindeditor代码高亮自动行号功能

    kindeditor代码高亮自动行号功能 代码自动行号功能 kindeditor默认未开启代码行号显示功能的,可以通过在html视图下,将需要显示行号的代码做如下更改: 不过虽然这样自定义很强,不过想 ...

  5. html代码高亮带行号,highlight代码高亮插件的使用(带行号)个人博客必备

    拥有个人博客的朋友应该很需要这样的插件,highlightjs代码高亮插件能让你的博客代码看起来更漂亮,让你的博客上一个档次,至于效果,直接看博主的个人博客就行了. 下载highlight代码高亮插件 ...

  6. linux带行号显示数据,linux中查看文件时显示行号

     [root@1-min etc]# cat -n rsyslog.conf//显示所有行号(包括空行) [root@1-min etc]# cat -b rsyslog.conf         ...

  7. Android开发之带行号显示的Log工具类

    import android.util.Log;/*** 日志控制*/ public class LogUtils {private final static String TAG = "L ...

  8. 在word中插入带行号的代码

    首先下载一个:Vim编译器 安装好后将 vim 程序所在的路径加入至系统环境变量 PATH 中 例如: 之后运行 PowerShell 在 PowerShell 中使用 Vim 打开源代码 例如: 之 ...

  9. word里面写封面时让那种带下划线的多行文字的下划线前后都对齐

    题目如上,写论文的时候封面要写什么题目.班级.学号.指导老师.时间.姓名一堆东西.大概如下所示: 问题的关键在于出现数字的哪一行总是对不齐,当然,是后面对不齐,前面一般用空格都能对齐,上面这张图是我改 ...

最新文章

  1. JavaScript中innerHTML与innerText,createTextNode的区别
  2. [转]使用Ant进行ssh和scp操作
  3. 使用Jenkins搭建自动化测试环境_环境准备_入门试炼01
  4. Zabbix(三)zabbix平台添加服务监控选项(http、nginx、mysql)
  5. Visual Studio-运行库的设置
  6. 大企业都在用的开源 ForgeRock OpenAM 被曝预认证 RCE 0day
  7. sort的排序及使用
  8. Visual Studio Code 基本操作 - Windows 版
  9. torch.FloatTensor和torch.Tensor、torch.tensor
  10. Python 数据分析 —— Matplotlib ①
  11. msfconsole 控制台使用和操作
  12. 001电机的分类:不骗你,如果你没读这篇文章,可能都不知道还有这种类型的电机!
  13. 分销商城业务逻辑设计_功能思维导图_OctShop
  14. 加班又如何,我要薅资本家羊毛《打工人的那些事》
  15. 物联网小课堂之NB-IoT无线通信中的发射功率和接收灵敏度
  16. oracle minus 利用率,oracle minus用法
  17. 显示HTML的版权符号
  18. 又学一招——Chrome 插件安装技巧
  19. 各国海关单证有哪些要求?
  20. ASEMI整流二极管A7二极管和M7二极管能代换吗

热门文章

  1. 计算机绘图线型标准,计算机绘图图层设置和线型宽度.doc
  2. 为Word2013文档加密
  3. android studio教程离线安装findbugsieda报错,使用 FindBugs-IDEA 插件查找代码中潜在的 BUG...
  4. 通过简单修改轻松免费拉满百度网盘的下载速度!
  5. EXCEL中筛选一列数据中所包含的某些数字,返回它前面的序号
  6. 【开源GPS追踪】 之 硬件开源
  7. 遇到问题---tableau prep builder--运行时报错系统错误
  8. Python之scapy-sniff(流量监控)
  9. 最大脑洞霍金去世了!缅怀!
  10. 数字字母特殊符号java_java正则匹配6-20位字母、数字、特殊符号最少满足其中两种...