您的位置:程序门 -> .net技术 -> c#



救我啊,如何重绘textbox里面的字


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


救我啊,如何重绘textbox里面的字[已结贴,结贴人:os_50]
发表于:2007-01-04 14:28:55 楼主
我重写了textbox的onpaint函数但是没有作用啊,
就想重绘一下textbox里面的text
给个例子吧
发表于:2007-01-04 15:34:191楼 得分:1
//拦截系统消息,获得当前控件进程以便重绘。  
                                //一些控件(如textbox、button等)是由系统进程绘制,重载onpaint方法将不起作用.  
                                //所有这里并没有使用重载onpaint方法绘制textbox边框。  
                                //  
                                //msdn:重写   onpaint   将禁止修改所有控件的外观。  
                                //那些由   windows   完成其所有绘图的控件(例如   textbox)从不调用它们的   onpaint   方法,  
                                //因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档,  
                                //查看   onpaint   方法是否可用。如果某个控件未将   onpaint   作为成员方法列出,  
                                //则您无法通过重写此方法改变其外观。  
                                //  
                                //msdn:要了解可用的   message.msg、message.lparam   和   message.wparam   值,  
                                //请参考位于   msdn   library   中的   platform   sdk   文档参考。可在   platform   sdk(“core   sdk”一节)  
                                //下载中包含的   windows.h   头文件中找到实际常数值,该文件也可在   msdn   上找到。
发表于:2007-01-04 15:34:542楼 得分:0
using   system;  
using   system.componentmodel;  
using   system.collections;  
using   system.diagnostics;  
using   system.windows.forms;  
using   system.drawing;  
using   system.drawing.drawing2d;  

namespace   bensoftcn.winforms.ui  
{  

        [toolboxitem(true)]  
        public   class   textboxxp   :   system.windows.forms.textbox  
        {  
                ///   <summary>  
                ///   获得当前进程,以便重绘控件  
                ///   </summary>  
                ///   <param   name= "hwnd "> </param>  
                ///   <returns> </returns>  
                [system.runtime.interopservices.dllimport( "user32.dll ")]  
                static   extern   intptr   getwindowdc(intptr   hwnd);  
                [system.runtime.interopservices.dllimport( "user32.dll ")]  
                static   extern   int   releasedc(intptr   hwnd,   intptr   hdc);  

                ///   <summary>  
                ///   是否启用热点效果  
                ///   </summary>  
                private   bool   _hottrack   =   true   ;  

                ///   <summary>  
                ///   边框颜色  
                ///   </summary>  
                private   color   _bordercolor   =   color.fromargb(0xa7,0xa6,0xaa);  

                ///   <summary>  
                ///   热点边框颜色  
                ///   </summary>  
                private   color   _hotcolor   =   color.fromargb(0x33,0x5e,0xa8);  

                ///   <summary>  
                ///   是否鼠标mouseover状态  
                ///   </summary>  
                private   bool   _ismouseover   =   false   ;  
                 
                #region   属性  
                ///   <summary>  
                ///   是否启用热点效果  
                ///   </summary>  
                [   category( "行为 "),  
                description( "获得或设置一个值,指示当鼠标经过控件时控件边框是否发生变化。只在控件的borderstyle为fixedsingle时有效 "),  
                defaultvalue(true)]  
                public   bool   hottrack  
                {  
                        get  
                        {  
                                return   this._hottrack   ;  
                        }  
                        set  
                        {  
                                this._hottrack   =   value   ;  
                                //在该值发生变化时重绘控件,下同  
                                //在设计模式下,更改该属性时,如果不调用该语句,  
                                //则不能立即看到设计试图中该控件相应的变化  
                                this.invalidate();    
                        }  
                }  
                ///   <summary>  
                ///   边框颜色  
                ///   </summary>  
                [   category( "外观 "),  
                description( "获得或设置控件的边框颜色 "),  
                defaultvalue(typeof(color), "#a7a6aa ")]  
                public   color   bordercolor  
                {  
                        get  
                        {    
                                return   this._bordercolor;    
                        }  
                        set  
                        {    
                                this._bordercolor   =   value;    
                                this.invalidate();    
                        }  
                }        
                ///   <summary>  
                ///   热点时边框颜色  
                ///   </summary>  
                [   category( "外观 "),  
                description( "获得或设置当鼠标经过控件时控件的边框颜色。只在控件的borderstyle为fixedsingle时有效 "),  
                defaultvalue(typeof(color), "#335ea8 ")]  
                public   color   hotcolor  
                {  
                        get  
                        {    
                                return   this._hotcolor;    
                        }  
                        set  
                        {    
                                this._hotcolor   =   value;    
                                this.invalidate();    
                        }  
                }        
                #endregion   属性  

                ///   <summary>  
                ///    
                ///   </summary>  
                public   textboxxp():base()  
                {                          
                }  

发表于:2007-01-04 15:34:573楼 得分:7
///   <summary>  
                ///   鼠标移动到该控件上时  
                ///   </summary>  
                ///   <param   name= "e "> </param>  
                protected   override   void   onmousemove(mouseeventargs   e)  
                {  
                        //鼠标状态  
                        this._ismouseover   =   true   ;  
                        //如果启用hottrack,则开始重绘  
                        //如果不加判断这里不加判断,则当不启用hottrack,  
                        //鼠标在控件上移动时,控件边框会不断重绘,  
                        //导致控件边框闪烁。下同  
                        //谁有更好的办法?please   tell   me   ,   thanks。  
                        if(this._hottrack)  
                        {  
                                //重绘  
                                this.invalidate();  
                        }  
                        base.onmousemove   (e);  
                }  
                ///   <summary>  
                ///   当鼠标从该控件移开时  
                ///   </summary>  
                ///   <param   name= "e "> </param>  
                protected   override   void   onmouseleave(eventargs   e)  
                {  
                        this._ismouseover   =   false   ;  

                        if(this._hottrack)  
                        {  
                                //重绘  
                                this.invalidate();  
                        }  
                        base.onmouseleave   (e);  
                }  
                 
                ///   <summary>  
                ///   当该控件获得焦点时  
                ///   </summary>  
                ///   <param   name= "e "> </param>  
                protected   override   void   ongotfocus(eventargs   e)  
                {  

                        if(this._hottrack)  
                        {  
                                //重绘  
                                this.invalidate();  
                        }  
                        base.ongotfocus   (e);  
                }  
                ///   <summary>  
                ///   当该控件失去焦点时  
                ///   </summary>  
                ///   <param   name= "e "> </param>  
                protected   override   void   onlostfocus(eventargs   e)  
                {  
                        if(this._hottrack)  
                        {  
                                //重绘  
                                this.invalidate();  
                        }  
                        base.onlostfocus   (e);  
                }  

                ///   <summary>  
                ///   获得操作系统消息  
                ///   </summary>  
                ///   <param   name= "m "> </param>  
                protected   override   void   wndproc(ref   message   m)  
                {  

                        base.wndproc   (ref   m);  
                        if   (m.msg==0xf   ¦ ¦   m.msg==0x133)  
                        {  
                                //拦截系统消息,获得当前控件进程以便重绘。  
                                //一些控件(如textbox、button等)是由系统进程绘制,重载onpaint方法将不起作用.  
                                //所有这里并没有使用重载onpaint方法绘制textbox边框。  
                                //  
                                //msdn:重写   onpaint   将禁止修改所有控件的外观。  
                                //那些由   windows   完成其所有绘图的控件(例如   textbox)从不调用它们的   onpaint   方法,  
                                //因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档,  
                                //查看   onpaint   方法是否可用。如果某个控件未将   onpaint   作为成员方法列出,  
                                //则您无法通过重写此方法改变其外观。  
                                //  
                                //msdn:要了解可用的   message.msg、message.lparam   和   message.wparam   值,  
                                //请参考位于   msdn   library   中的   platform   sdk   文档参考。可在   platform   sdk(“core   sdk”一节)  
                                //下载中包含的   windows.h   头文件中找到实际常数值,该文件也可在   msdn   上找到。  
                                intptr   hdc   =   getwindowdc(m.hwnd);    
                                if   (hdc.toint32()   ==   0)    
                                {    
                                        return;    
                                }    

                                //只有在边框样式为fixedsingle时自定义边框样式才有效  
                                if(this.borderstyle   ==   borderstyle.fixedsingle)  
                                {                                  
                                        //边框width为1个像素  
                                        system.drawing.pen   pen   =   new   pen(this._bordercolor,1)   ;;  
                                 
                                        if(this._hottrack)  
                                        {                                                  
                                                if(this.focused)  
                                                {  
                                                        pen.color   =   this._hotcolor   ;  
                                                }  
                                                else  
                                                {  
                                                        if(this._ismouseover)  
                                                        {  
                                                                pen.color=this._hotcolor;  
                                                        }  
                                                        else  
                                                        {  
                                                                pen.color   =   this._bordercolor   ;  
                                                        }  
                                                }                                                  
                                        }  
                                        //绘制边框  
                                        system.drawing.graphics   g     =   graphics.fromhdc(hdc);    
                                        g.smoothingmode   =   system.drawing.drawing2d.smoothingmode.antialias;              
                                        g.drawrectangle(pen,0,0,this.width-1,   this.height-1)   ;  
                                        pen.dispose();  
                                }  
                                //返回结果  
                                m.result   =   intptr.zero;    
                                //释放  
                                releasedc(m.hwnd,hdc);  
                        }  
                }  

        }  
}  
发表于:2007-01-04 15:40:264楼 得分:1
sf
发表于:2007-01-04 15:43:225楼 得分:1
想重绘一下textbox里面的text
-------------------
那就继承此控件,重写他的render
发表于:2007-01-04 17:46:156楼 得分:0
重绘一下textbox里面的text
-------------------
那就继承此控件,重写他的render
---------
    楼上,没找到这个函数啊,textbox有吗,不是toolstrip的textbox
发表于:2007-01-04 17:50:167楼 得分:0
to   jackyped(★★★★★★★★★★[我的星星是蓝色-_-!!!])   :

谢谢你的回答,你的例子能运行,但是我在drawrectangle后面加了一行
g.drawstring(this.text,   this.font,   new   system.drawing.solidbrush(color.red),   this.bounds);没有效果,能否帮忙看看?
发表于:2007-01-05 09:18:298楼 得分:0
gz


快速检索

最新资讯
热门点击