在填表单的时候,每一个空缺项都是以下划线的形式出现,此时如果在空缺的位置放置一个TextBox控件,看起来既不美观也不符合常理。本实例可以很好的解决此问题,实例运行结果如图:
本实例主要用到自定义类CustomTextBoxGroup,该类的功能是用来继承TextBox控件,并拓展原有控件的一些功能。在其构造方法中,定义控件的外观和位置。在重写Windows处理消息的函数中,捕获处理TextBox控件编辑颜色和绘制的消息,然后用自定义方法DrawBottomLines绘制TextBox控件的下划线。本实例在实现绘制TextBox控件下划线的过程中,需要获取整个窗口的设备场景,因此用到Windows提供的API函数GetWindowDC和用于释放设备场景的API函数ReleaseDC,下面介绍本实例中用到的技术。
(1)CustomTextBoxGroup方法
该方法为类CustomTextBoxGroup的构造方法。其语法格式如下:
publicCustomTextBoxGroup()
(2)WndProc方法
该方法用来捕获处理TextBox控件编辑颜色和绘制的消息。其语法格式如下:
protectedoverridevoidWndProc(refMessagem){(refm);//处理消息}
(3)DrawBottomLines方法
该方法用来绘制TextBox控件的底端横线。其语法格式如下:
publicvoidDrawBottomLines(Graphicsg)
参数说明如下。
g:表示GDI+绘图图面对象。
返回值:该方法无返回值。
(4)GetWindowDC方法
该方法用来获取当前窗口的设备场景。其语法格式如下:
[DllImport("")]publicstaticexternIntPtrGetWindowDC(IntPtrhWnd);
参数说明如下。
hWnd:表示要释放的设备场景相关的窗口句柄。
hDC:表示要释放的设备场景句柄。
返回值:执行成功返回1,否则,返回0。
注意:在本实例中用到Windows提供的API函数,因此用到命名空间。在进行TextBox控件的绘制操作时需要引用命名空间。
(1)创建一个项目,将其命名为VisionUnderLine,修改默认窗体为VisionUnderLine。
(2)主要程序代码。
在窗体加载时,直接调用自定义类中的内容声明一个TextBox控件goal,并指定自定义控件goal的父容器为当前窗体,然后将控件添加至当前窗体。代码如下:
privatevoidVisionUnderLine_Load(objectser,EventArgse){=newCustomTextBoxGroup();//定义一个TextBox对象=this;//获取或设置自定义TextBox控件的父容器(goal);//向窗体中添加自定义TextBox控件goal}
在自定义类CustomTextBoxGroup的构造方法中,首先定义TextBox控件的位置和大小。代码如下:
publicCustomTextBoxGroup(){=180;//设置控件的宽度=100;//设置控件的高度=;//设置控件为无边框状态=60;//设置控件上边缘与其容器工作区上边缘之间的距离=100;//设置控件左边缘与其容器工作区左边缘之间的距离}
在该类的内部需要对用到的一些变量进行声明。代码如下:
publicconstintWM_PAINT=0x000F;//该变量标识绘制TextBox控件publicconstintWM_CTLCOLOREDIT=0x0133;//该变量表示开始编辑TextBox控件的颜色[DllImport("")]publicstaticexternIntPtrGetWindowDC(IntPtrhWnd);//获取整个窗口的设备场景[DllImport("")]//释放由调用GetDC或GetWindowDC函数获取的指定设备场景,它对类或私有设备场景无效publicstaticexternintReleaseDC(IntPtrhWnd,IntPtrhDC);
重载Windows处理消息的函数WndProc,对相应的消息捕获后进行处理。代码如下:
protectedoverridevoidWndProc(refMessagem){(refm);//处理消息switch()//截获有关TextBox控件的绘制信息{caseWM_CTLCOLOREDIT://当开始编辑TextBox控件的颜色时gotocaseWM_PAINT;//跳转到TextBox控件的绘制caseWM_PAINT://当开始绘制TextBox控件时IntPtrhDC=GetWindowDC();//获取当前窗口的设备场景if(()!=0)//当此场景存在时{using(Graphicsg=(hDC))//声明一个GDI+绘图图面类对象g所占用的资源{DrawBottomLines(g);//绘制TextBox控件的底端横线();//释放GDI+绘图图面类对象g所占用的资源}}=;//指定在当前条件下的返回值ReleaseDC(,hDC);//释放指定设备的场景break;}}
当捕获绘制TextBox控件的消息后,需要绘制它的底端边框,此时用到DrawBottomLines方法。代码如下:
publicvoidDrawBottomLines(Graphicsg){Penp=newPen(,2);//定义一个用于绘制直线和曲线的对象并设定它的颜色和宽度(p,1,1,,);//绘制由坐标对、宽度和高度指定的矩形p=newPen((0,0,0),1);//定义一个用于绘制直线和曲线的对象并设定它的颜色和宽度(p,0,,,);//绘制TextBox的底端横线();//释放画笔p所占用的资源}
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。