如何在文本框中自定义绘制边距
本文关键字:自定义 绘制 文本 | 更新日期: 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);
}
}
}
这里至少有三个问题:
- 当用户输入一些文本时,部分行被空白(变白)。
- 当用户用鼠标选择一些文本时,上述情况再次发生。
- 文本框滚动时行闪烁
我注意到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;
}
由于面板没有启用,它不接受鼠标输入