如何在文本框中自定义绘制边距

本文关键字:自定义 绘制 文本 | 更新日期: 2023-09-27 18:08:03

我想在WinForms文本框中绘制80个字符的边距线。这是我所尝试的,在我的TextBox子类:

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    const int WM_PAINT = 0x00F;
    if (m.Msg == WM_PAINT) {
        DrawMargin();
    }
}
void DrawMargin()
{
    using (Pen pen = new Pen(Color.Gray, 1)) {
        using (Graphics graphics = CreateGraphics()) {
            float charWidth = graphics.MeasureString("M", Font).Width;
            graphics.DrawLine(pen, charWidth * 80, 0, charWidth * 80, Height);
        }
    }
}

这里至少有三个问题:

  1. 当用户输入一些文本时,部分行被空白(变白)。
  2. 当用户用鼠标选择一些文本时,上述情况再次发生。
  3. 文本框滚动时行闪烁

我注意到TED记事本(使用Win32 EDIT控件)能够在没有任何问题的情况下绘制空白,所以似乎可以做我想做的事情。谁能告诉我怎么做?

如何在文本框中自定义绘制边距

我不确定这个方法。但你可以尝试的一件事是在文本框中插入图像。图片当然是你的页边距,文字会自动在图片之后开始。要在文本框中包含图片,请参见如何将图像插入到RichTextBox中?

编辑:我也发现了这篇文章http://www.codedblog.com/2007/09/17/owner-drawing-a-windowsforms-textbox/,这似乎有助于在文本框的背景中绘画。这里描述的方法似乎带你走了很长一段路来满足你的需求。

据我所知,这样做的最好方法是简单地放置一个WinForms。文本框上方的面板:

class FooTextBox : TextBox
{
    public FooTextBox()
    {
        margin = new Panel();
        margin.Enabled   = false;
        margin.BackColor = Color.LightGray;
        margin.Top       = 0;
        margin.Height    = ClientSize.Height;
        margin.Left      = <whatever>;
        margin.Width     = 1;
        Controls.Add(margin);
    }
    Panel margin;
}

由于面板没有启用,它不接受鼠标输入