C#RichTextBox突出显示行

时间:2014-04-12 13:13:56

标签: c#

我已经上传了一张我想要获得的图片...... enter image description here

因此,你可以看到我想突出显示我点击的行[并在_textchanged事件上更新它! 是否有任何可能的方式以任何颜色这样做...不一定是黄色。我搜索了很多,但我不明白如何获得起始长度和结束长度以及所有这些。

它让我很困惑,我不知道;理解并需要一些帮助。 感谢此主题中给出的所有帮助。也是windows形式。我正在制作记事本应用程序,如记事本++或其他一些记事本应用程序... .NET Windows Form C#RichTextBox

1 个答案:

答案 0 :(得分:5)

您需要创建自己的控件,该控件继承自RichTextBox并在表单上使用该控件。由于RichTextBox不支持所有者绘图,因此您必须侦听WM_PAINT消息,然后在那里进行工作。这是一个相当好的例子,虽然行高现在是硬编码的:

 public class HighlightableRTB : RichTextBox
 {
     // You should probably find a way to calculate this, as each line could have a different height.
     private int LineHeight = 15; 
     public HighlightableRTB()
     {
         HighlightColor = Color.Yellow;
     }

    [Category("Custom"),
    Description("Specifies the highlight color.")]
     public Color HighlightColor { get; set; }

     protected override void OnSelectionChanged(EventArgs e)
     {
         base.OnSelectionChanged(e);
         this.Invalidate();
     }

     private const int WM_PAINT = 15;

     protected override void WndProc(ref Message m)
     {
         if (m.Msg == WM_PAINT)
         {
             var selectLength = this.SelectionLength;
             var selectStart = this.SelectionStart;

             this.Invalidate();
             base.WndProc(ref m);

             if (selectLength > 0) return;   // Hides the highlight if the user is selecting something

             using (Graphics g = Graphics.FromHwnd(this.Handle))
             {
                 Brush b = new SolidBrush(Color.FromArgb(50, HighlightColor));
                 var line = this.GetLineFromCharIndex(selectStart);
                 var loc = this.GetPositionFromCharIndex(this.GetFirstCharIndexFromLine(line));

                 g.FillRectangle(b, new Rectangle(loc, new Size(this.Width, LineHeight)));
             }
         }
         else
         {
             base.WndProc(ref m);
         }
     }
 }