试图在没有边框的文本框下划一条线可是有问题
来源:互联网 发布: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()
你把字体的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);
}
}
}
- 试图在没有边框的文本框下划一条线可是有问题
- 在字体上划一条线
- eclipse或Studio在代码上划一条线是什么意思?
- 关于边框在选中的时候与其他父类不一样,即没有下边框的问题
- jqgrid在chrome下有滚动条的问题
- png图在ie8下有黑色边框的解决方法
- 让文本框EditText有边框
- 程序在Debug、Release下运行及单独运行Debug下的exe文件时没有问题;可是单独运行Release所生成的exe文件时,点击某一个按钮时,程序崩溃
- Eclipse问题里显示有错误,可是项目里明明没有错误怎么办
- 解决Ubuntu窗口没有边框的问题
- 如果你没有可用分.可是有PHP方面简单问题.可以直接留言给我,我会尽量的回答。
- 如何让td的边框显示(在td内没有内容的情况下)
- 请教大侠们了在jsf的〈h:dataTable>中没有数据的表格就平了,怎么才能让下和有数据的一样能产生有边框的感觉
- .9.png右下边边框(黑条)没有完全拉伸导致图片不能完全覆盖背景的问题
- 有没有获取文本框内容的新鲜方法?
- a 标签点击有边框的问题
- html中去掉文本框(input type="text")的边框或只显示下边框
- html中去掉文本框(input type="text")的边框或只显示下边框
- UTF-8和unicode终极解答
- 不想做复合控件,想在文本框里加个按钮
- UNIX系统管理技术手册(第三版)
- C++各大名库宝典
- 硬盘的损伤与工作原理
- 试图在没有边框的文本框下划一条线可是有问题
- sql日期函数
- 博达路由器配置外网IP和默认路由
- 使用DataBinder.Eval绑定DataSource
- Spring事务配置上去后出现如下报错:java.lang.ClassCastException: $Proxy1解决
- JavaScript 对象与数组参考大全
- Javascript编程小结(1通用对象)
- 类模板的成员函数
- Chord实现代码分析(二)