【问题标题】:How to custom-draw a margin in a TextBox?如何在 TextBox 中自定义绘制边距?
【发布时间】:2011-11-13 00:10:07
【问题描述】:

我想在 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. TextBox 滚动时线条闪烁。

我注意到 TED 记事本(使用 Win32 EDIT 控件)能够毫无问题地绘制边距,所以似乎可以做我想做的事。谁能告诉我怎么做?

【问题讨论】:

  • 相当大的把戏。 EDIT 在不使用 WM_PAINT 的情况下绘制,这是在 Windows 2 必须在 386SUX 处理器上运行时犯下的罪行。在此过程中擦除您的线路。你得问问泰德他是怎么做到的。
  • 谢谢,我去问问他/她。

标签: c# .net winforms


【解决方案1】:

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

编辑:我还发现了这篇文章http://www.codedblog.com/2007/09/17/owner-drawing-a-windowsforms-textbox/,它似乎有助于在文本框的背景中进行绘画。此处描述的方法似乎使您朝着您的要求迈出了一大步。

希望这会有所帮助。

【讨论】:

  • 这似乎与 RichTextBox 控件有关,而我使用的是 TextBox。
【解决方案2】:

据我所知,最好的方法就是在 TextBox 上放置一个 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;
}

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

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多