winform的RichTextBox设置网格线,类似word的稿纸效果

描述

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删除线的效果。

本来还想通过富文本的表格来实现网格线效果,这样文本和线条就可以一起滚动。但是鉴于实际操作困难重重,也没能实现。

测试结果,勉强符合预期效果

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值