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