发布网友 发布时间:2022-04-30 04:15
共1个回答
热心网友 时间:2022-04-20 17:16
可以使用TextBox 进行重绘
这是我刚刚做出来的 代码比较粗糙
具体的行距等等需要你自己去 算 我这里只写的粗算 行数太多的话行距有小误差
代码 首先重写Text
class MyTextBox : TextBox
{
const int WM_ERASEBKGND = 0x0014;
public static SizeF FontSize(string 文字, Font 字体, Graphics MaxIn)
{
SizeF FontSize = MaxIn.MeasureString(文字, 字体);
return FontSize;
}
protected void OnEraseBkgnd(Graphics gs)
{
gs.FillRectangle(Brushes.White, 0, 0, this.Width, this.Height); //填充为白色
SizeF 行属性 = FontSize("文字", this.Font, gs);
int h=this.Height ;
float w=this.Width ;
int n = (int)(h / (行属性.Height-2));
float T = 行属性.Height / 17;
float h2 = 行属性.Height / (float)4.5;
for (int i = 1; i <= n; i++)
{
gs.DrawLine(new Pen(Color.Black), 2, (float)(T + (行属性.Height - h2) * i), w-6, (float)(T + (行属性.Height - h2) * i));
}
gs.Dispose();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_ERASEBKGND) //绘制背景
{
OnEraseBkgnd( Graphics.FromHdc(m.WParam));
m.Result = (IntPtr)1;
}
base.WndProc(ref m);
}
}
然后再窗口里面修改控件背景透明色
const int WM_CTLCOLOREDIT = 0x0133;
const int TRANSPARENT = 0x1;
[DllImport("gdi32")]
static extern int SetBkMode(IntPtr hdc, int bkMode);
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CTLCOLOREDIT && (m.LParam == myTextBox1.Handle
{
SetBkMode(m.WParam, TRANSPARENT);
return;
}
else base.WndProc(ref m);
}
追答可以的
你在KeyDown 里面判断如果输入了回车那么 在文本框中查找 当前有多少个回车就 绘制多少行
当然要当前回车+1因为在KeyDown 的时候本次输入的回车没有计算
然后绘制之前保存当前文本框的内容+回车 然后绘制完成之后 先清空 文本框然后重写赋值 文本框
并设置文本框选择开始为文本框TEXT长度
初始化一行 修改 protected void OnEraseBkgnd(Graphics gs) 事件下的代码
gs.DrawLine(new Pen(Color.Black), 2, (float)(T + (行属性.Height - h2) * i), w-6, (float)(T + (行属性.Height - h2) * i));
去掉循环 去掉*i 就好了