C#自定义TextBox,重画背景和边框,帮顶给分~

时间:2022-07-07 21:26:38
当前我已经想办法重载了WinProc,拦截了OnPaint消息。
并在背景贴了图,但是TextBox默认有BackColor,总是覆盖到我贴的图上面。
重载了OnPaintBackground,但是不起作用,用PostMessage发送WM_ERASEBKGND也不行。
怎么也搞不定了,请大家帮忙。

27 个解决方案

#1


楼主太强了,学习一下......

#2


自己顶一下,请大家帮忙~

#3


不了解,帮顶...

#4


自己再顶下,怎么没人理我,郁闷了。

#5


SetBkMode(hdc,TRANSPARENT); 先设背景透明,另外不要用textbox,用drawtext画上去,字就没背景了,不知道是不是这个情况。

#6


谢谢5楼,我是用C#继承TextBox来做的。
不用TextBox,有很多TextBox的特性都要自己来实现,成本太高(比如按向左,向右键,需要计算文字长度,显示在框里的文字,光标位置等等)。

#7


那就试试设背景为透明,用textbox可以不。

#8


UP

#9


没试过~~~既然可以操作消息了,那就是你绘完之后又有新的操作覆盖了吧,记录一下日志看看顺序?
再就是把BackColor设置为null试试?呵呵,纯属瞎猜~~~

#10


SetBkMode(hdc,TRANSPARENT); 
这么试了,还是不好用。
BackColor是不可空类型,所以没法设置成null啊。

谢谢大家帮忙!~

#11


关注,楼主的类是继承UserControl类吗?

#12


为什么要重写这个控件?

#13


透明属性不起作用么?

#14


答11楼:继承的是TextBox。
答12楼:界面设计要求是带背景的TextBox,并且是圆角矩形的边框。
答13楼:透明属性指什么?指SetBkMode(hdc,TRANSPARENT);这个函数的TRANSPARENT参数么,这个试过了,没有效果。

#15


::SetBkMode(hDC,TRANSPARENT); 这样在c++管用的 能把背景设置成透明色

#16


引用楼主 jiangyongtao 的回复:
当前我已经想办法重载了WinProc,拦截了OnPaint消息。
并在背景贴了图,但是TextBox默认有BackColor,总是覆盖到我贴的图上面。
重载了OnPaintBackground,但是不起作用,用PostMessage发送WM_ERASEBKGND也不行。
怎么也搞不定了,请大家帮忙。


C#盲弱弱问一句, textbox是否是edit控件?

如果是的话,就得处理 WM_CTLCOLOR, 在这里面设置好控件的 bkmode,bkbrush,textcolor,textfont等等.
你试试.

#17


嗯,C#的Textbox控件就是C++的Edit Control。
我再根据你的想法试试吧,谢谢。
已经说服设计人员,不改背景和边框了,麻烦。

#18


没改过编辑框· 帮up·

#19


如果真是那样的话,是否可以继承Control类,就是麻烦多了。要自己做textbox了。

#20


SetBkMode 首先要使用HDC的句柄,应该是可以设置背景透明的

#21


引用 19 楼 xmsheji 的回复:
如果真是那样的话,是否可以继承Control类,就是麻烦多了。要自己做textbox了。

是啊,这么做太麻烦了,所以放弃了。成本太高了。

#22


用C#的话,成本就是很高,很多东西都没有,只能自己做...

#23


wm_ctlcolor有用吗?试了没?

我自己重绘edit控件是这么做的。

#24


怎么重载的WinProc啊???
能说下吗?

#25


我让C#的程序用上Aero效果,结果textbox在磨砂玻璃的地方显示不正常,我也是重载WinProc来重绘的,背景图没试,但是边框没问题呀。
protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            const int WM_PAINT = 0xF;
            if (m.Msg == WM_PAINT && this.BorderStyle == System.Windows.Forms.BorderStyle.FixedSingle)
            {
                Graphics g = Graphics.FromHwnd(this.Handle);
                
//绘图操作

                g.Dispose();
            }
        }

用的时候把BorderStyle设为FixedSingle。

#26


有没有详细的代码片段啊?

#27


没想到,时隔一年,我又遇到了这个问题

#1


楼主太强了,学习一下......

#2


自己顶一下,请大家帮忙~

#3


不了解,帮顶...

#4


自己再顶下,怎么没人理我,郁闷了。

#5


SetBkMode(hdc,TRANSPARENT); 先设背景透明,另外不要用textbox,用drawtext画上去,字就没背景了,不知道是不是这个情况。

#6


谢谢5楼,我是用C#继承TextBox来做的。
不用TextBox,有很多TextBox的特性都要自己来实现,成本太高(比如按向左,向右键,需要计算文字长度,显示在框里的文字,光标位置等等)。

#7


那就试试设背景为透明,用textbox可以不。

#8


UP

#9


没试过~~~既然可以操作消息了,那就是你绘完之后又有新的操作覆盖了吧,记录一下日志看看顺序?
再就是把BackColor设置为null试试?呵呵,纯属瞎猜~~~

#10


SetBkMode(hdc,TRANSPARENT); 
这么试了,还是不好用。
BackColor是不可空类型,所以没法设置成null啊。

谢谢大家帮忙!~

#11


关注,楼主的类是继承UserControl类吗?

#12


为什么要重写这个控件?

#13


透明属性不起作用么?

#14


答11楼:继承的是TextBox。
答12楼:界面设计要求是带背景的TextBox,并且是圆角矩形的边框。
答13楼:透明属性指什么?指SetBkMode(hdc,TRANSPARENT);这个函数的TRANSPARENT参数么,这个试过了,没有效果。

#15


::SetBkMode(hDC,TRANSPARENT); 这样在c++管用的 能把背景设置成透明色

#16


引用楼主 jiangyongtao 的回复:
当前我已经想办法重载了WinProc,拦截了OnPaint消息。
并在背景贴了图,但是TextBox默认有BackColor,总是覆盖到我贴的图上面。
重载了OnPaintBackground,但是不起作用,用PostMessage发送WM_ERASEBKGND也不行。
怎么也搞不定了,请大家帮忙。


C#盲弱弱问一句, textbox是否是edit控件?

如果是的话,就得处理 WM_CTLCOLOR, 在这里面设置好控件的 bkmode,bkbrush,textcolor,textfont等等.
你试试.

#17


嗯,C#的Textbox控件就是C++的Edit Control。
我再根据你的想法试试吧,谢谢。
已经说服设计人员,不改背景和边框了,麻烦。

#18


没改过编辑框· 帮up·

#19


如果真是那样的话,是否可以继承Control类,就是麻烦多了。要自己做textbox了。

#20


SetBkMode 首先要使用HDC的句柄,应该是可以设置背景透明的

#21


引用 19 楼 xmsheji 的回复:
如果真是那样的话,是否可以继承Control类,就是麻烦多了。要自己做textbox了。

是啊,这么做太麻烦了,所以放弃了。成本太高了。

#22


用C#的话,成本就是很高,很多东西都没有,只能自己做...

#23


wm_ctlcolor有用吗?试了没?

我自己重绘edit控件是这么做的。

#24


怎么重载的WinProc啊???
能说下吗?

#25


我让C#的程序用上Aero效果,结果textbox在磨砂玻璃的地方显示不正常,我也是重载WinProc来重绘的,背景图没试,但是边框没问题呀。
protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            const int WM_PAINT = 0xF;
            if (m.Msg == WM_PAINT && this.BorderStyle == System.Windows.Forms.BorderStyle.FixedSingle)
            {
                Graphics g = Graphics.FromHwnd(this.Handle);
                
//绘图操作

                g.Dispose();
            }
        }

用的时候把BorderStyle设为FixedSingle。

#26


有没有详细的代码片段啊?

#27


没想到,时隔一年,我又遇到了这个问题