试图在没有边框的文本框下划一条线可是有问题

来源:互联网 发布:99乘法表js代码 编辑:程序博客网 时间:2024/05/17 02:44
代码如下  
      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);  
  }  
  }  
  }