如何在TextBox中自定义绘制边距?

时间:2011-09-08 13:22:27

标签: c# .net winforms

我想在WinForms TextBox中绘制一个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. 滚动TextBox时线条会闪烁。
  4. 我注意到TED Notepad(使用Win32 EDIT控件)能够毫无问题地绘制边距,所以看起来可以做我想做的事情。谁能告诉我怎么样?

2 个答案:

答案 0 :(得分:1)

我不确定这种方法。但是您可以尝试的一件事是将图像插入文本框。图像当然是你的边距,文字将在图片后自动开始。要在文本框中包含图片,请参阅How can I insert an image into a RichTextBox?

编辑:我还发现这篇文章http://www.codedblog.com/2007/09/17/owner-drawing-a-windowsforms-textbox/似乎有助于在文本框的背景中进行绘画。这里描述的方法似乎会带你走很远的路。

希望这有帮助。

答案 1 :(得分:1)

据我所知,最好的方法是在文本框上放置一个WinForms.Panel:

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

由于面板未启用,因此不会输入鼠标。