描述
RichTextBox的文本区显示网格线,效果类似于word的稿纸效果。
解决方法
1、RichTextBox添加带有网格线的背景图片
设置RichTextBox的背景图片属性,放入指定图片
2、设置RichTextBox的背景色为透明,将它放在panel中,在panel中画横线
RichTextBox的设置背景透明代码:
https://blog.csdn.net/weixin_38980552/article/details/78960518
RichTextBox失去焦点后高亮显示所选内容
https://www.douban.com/note/220979899/
public partial class EditRichTextBox : RichTextBox
{
public EditRichTextBox()
{
//当前文本框控件没有焦点时,该控件中选中的文本保持突出显示
this.HideSelection = false;
}
//设置背景透明
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; // 开启 WS_EX_TRANSPARENT,使控件支持透明
return cp;
}
}
}
panel重绘闪烁问题
https://blog.csdn.net/u014234260/article/details/76577533
panel画横线:
public partial class LinePanel : Panel
{
private Pen lineColor = new Pen(Brushes.Blue);// 网格线颜色
private bool isShowLine = true;//是否显示网格线
private int rowHeight = 40;//网格线高度
private int scrollWidth = 20;//内部有滚动条时滚动条的宽度,防止线条一直在文本框的滚动条上显示
public LinePanel()
{
SetStyle(ControlStyles.UserPaint
| ControlStyles.AllPaintingInWmPaint
// | ControlStyles.OptimizedDoubleBuffer
| ControlStyles.ResizeRedraw
| ControlStyles.SupportsTransparentBackColor
, true
);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (isShowLine)
{
Graphics g = this.CreateGraphics();
Point[] line;
int width = this.Width - scrollWidth;
int count = this.Height / rowHeight;
for (int i = 0; i < count; i++)
{
line = new Point[2];
int y = rowHeight * (i + 1);
line[0] = new Point(0, y);
line[1] = new Point(width, y);
g.DrawLine(lineColor, line[0], line[1]);
}
}
}
}
为了防止网格线的长度固定,导致线画在文本框的滚动条上,需要在有无滚动条时设置横线的width。
代码如下:
private void editRichTextBox1_TextChanged(object sender, EventArgs e)
{
int rowCount = editRichTextBox1.GetLineFromCharIndex(editRichTextBox1.Text.Length) + 1;
if (rowCount * editRichTextBox1.RowHeight > editRichTextBox1.Height)
{
if (linePanel1.ScrollWidth == 0)
{
linePanel1.ScrollWidth = 20;
linePanel1.Refresh();
}
}
else
{
if (linePanel1.ScrollWidth == 20)
{
linePanel1.ScrollWidth = 0;
linePanel1.Refresh();
}
}
}
将这两个控件组合到一起,可实现文本框网格线效果。但是线条是不能随着文本滚动而变化的,达不到word的稿纸效果。
还有一点要注意,尽量使文本框控件的高度是行高的整数倍,否则滚动到最后会导致横线位置在文字上,类似word删除线的效果。
本来还想通过富文本的表格来实现网格线效果,这样文本和线条就可以一起滚动。但是鉴于实际操作困难重重,也没能实现。
测试结果,勉强符合预期效果