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

代码如下  
      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);  
  }  
  }  
  }     
  
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值