代码如下
1 this.SetStyle(ControlStyles.DoubleBuffer,true);
2 const int WM_NCPAINT = 0x0085;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch(m.Msg)
{
case WM_NCPAINT:
{
if (this.DrawLine)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
{
break;
}
Graphics g = Graphics.FromHdc(hDC);
Brush b = Brushes.Black;
Pen p = new Pen(b,2);
Point p1 = new Point(0,this.Height - 2);
Point p2 = new Point(this.Width,Height - 2);
g.DrawLine(p,p1,p2);
m.Result = IntPtr.Zero;
ReleaseDC(m.HWnd,hDC);
}
return;
}
}
}
问题如下:只有在控件有焦点时才有线,焦点离开线被背景遮住。
设置背景后也调用了 ,Invalidate()
你把字体的underline设置为true不行吗?
否则你在TextBox的下面加一个线状的控件就就可以了.......
还要响应WM_Paint
否则肯定被WM_Paint中画的覆盖掉
还有一点,一般要先调用Base.WndProc(ref m),然后再画图,否则可能会有问题
Jim3(Jim),文本输入线会被覆盖掉,不过好多了
如果没有边框,非客户区与客户区是重合的,在focus状态,非客户区需要显示,所以可以显示一条线,如果没有焦点,也就没有wm_ncpaint消息了
应该直接相应wm_paint,在wm_paint里划线
还有一点要提醒,下面这一句要小心,因为在不同Graphics画的图像可能会有问题
this.SetStyle(ControlStyles.DoubleBuffer,true);
不妨把这句去掉试试
而用
1 this.SetStyle(ControlStyles.UserPaint,true);
2 protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.DrawLine)
{
Brush b = Brushes.Black;
Pen p = new Pen(b,1);
Point p1 = new Point(0,this.Height - 1);
Point p2 = new Point(this.Width,Height - 1);
e.Graphics.DrawLine(p,p1,p2);
}
}
可以画上线,可是输入文本总被背景覆盖,而且字体也改变了。为什么
没有显示出来的原因是有边框的时候比没有边框的时候文本框的高度变小了.
你可以试着把线在有边框的时候画的靠上一此照样也会出来你说的情况的.
所以,线画不出来是因为你的当没有边框的时候文本框的高度变小,线画到了显示文字的地方,而在那里的文字的显示会把画给去掉的.
还有,其实你可以在如下的条件下来画线,这样就可以在重画的时候画你的线了:
m.Msg==0xf || m.Msg==0x133,比如你的代码改为如下就可以了:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg==0xf || m.Msg==0x133)
{
if (this.DrawLine)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
{
return;
}
Graphics g = Graphics.FromHdc(hDC);
Brush b = Brushes.Black;
Pen p = new Pen(b,2);
Point p1 = new Point(0,this.Height - 2);
Point p2 = new Point(this.Width,Height - 2);
g.DrawLine(p,p1,p2);
m.Result = IntPtr.Zero;
ReleaseDC(m.HWnd,hDC);
}
}
}
1 this.SetStyle(ControlStyles.DoubleBuffer,true);
2 const int WM_NCPAINT = 0x0085;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch(m.Msg)
{
case WM_NCPAINT:
{
if (this.DrawLine)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
{
break;
}
Graphics g = Graphics.FromHdc(hDC);
Brush b = Brushes.Black;
Pen p = new Pen(b,2);
Point p1 = new Point(0,this.Height - 2);
Point p2 = new Point(this.Width,Height - 2);
g.DrawLine(p,p1,p2);
m.Result = IntPtr.Zero;
ReleaseDC(m.HWnd,hDC);
}
return;
}
}
}
问题如下:只有在控件有焦点时才有线,焦点离开线被背景遮住。
设置背景后也调用了 ,Invalidate()
1楼
你把字体的underline设置为true不行吗?
2楼
否则你在TextBox的下面加一个线状的控件就就可以了.......
3楼
还要响应WM_Paint
否则肯定被WM_Paint中画的覆盖掉
还有一点,一般要先调用Base.WndProc(ref m),然后再画图,否则可能会有问题
4楼
Jim3(Jim),文本输入线会被覆盖掉,不过好多了
5楼
如果没有边框,非客户区与客户区是重合的,在focus状态,非客户区需要显示,所以可以显示一条线,如果没有焦点,也就没有wm_ncpaint消息了
应该直接相应wm_paint,在wm_paint里划线
6楼
还有一点要提醒,下面这一句要小心,因为在不同Graphics画的图像可能会有问题
this.SetStyle(ControlStyles.DoubleBuffer,true);
不妨把这句去掉试试
7楼
而用
1 this.SetStyle(ControlStyles.UserPaint,true);
2 protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.DrawLine)
{
Brush b = Brushes.Black;
Pen p = new Pen(b,1);
Point p1 = new Point(0,this.Height - 1);
Point p2 = new Point(this.Width,Height - 1);
e.Graphics.DrawLine(p,p1,p2);
}
}
可以画上线,可是输入文本总被背景覆盖,而且字体也改变了。为什么
8楼
没有显示出来的原因是有边框的时候比没有边框的时候文本框的高度变小了.
你可以试着把线在有边框的时候画的靠上一此照样也会出来你说的情况的.
所以,线画不出来是因为你的当没有边框的时候文本框的高度变小,线画到了显示文字的地方,而在那里的文字的显示会把画给去掉的.
9楼
还有,其实你可以在如下的条件下来画线,这样就可以在重画的时候画你的线了:
m.Msg==0xf || m.Msg==0x133,比如你的代码改为如下就可以了:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg==0xf || m.Msg==0x133)
{
if (this.DrawLine)
{
IntPtr hDC = GetWindowDC(m.HWnd);
if (hDC.ToInt32() == 0)
{
return;
}
Graphics g = Graphics.FromHdc(hDC);
Brush b = Brushes.Black;
Pen p = new Pen(b,2);
Point p1 = new Point(0,this.Height - 2);
Point p2 = new Point(this.Width,Height - 2);
g.DrawLine(p,p1,p2);
m.Result = IntPtr.Zero;
ReleaseDC(m.HWnd,hDC);
}
}
}