使用重绘项美化WinForm的控件
程序员文章站
2022-07-03 19:21:55
如果你觉得项目中的combobox、listbox或其它的winforms控件不能满足你的显示要求,包括窗体在内很多控件都支持重绘修改显示样式。下面的示例完成对combox...
如果你觉得项目中的combobox、listbox或其它的winforms控件不能满足你的显示要求,包括窗体在内很多控件都支持重绘修改显示样式。下面的示例完成对combox数据项的重绘,希望能起到抛砖引玉的作用。
显示源代码
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms; namespace simpledemo { public partial class frmdrawitem : form { public frmdrawitem() { initializecomponent(); //指定绘制模式,这项必须指定为,ownerdrawfixed,ownerdrawvariable //normal 由操作系统绘制,并且元素大小都相等。 //ownerdrawfixed 手动绘制的,并且元素大小都相等。 //ownerdrawvariable 手动绘制,元素大小可能不相等。 combobox2.drawmode = drawmode.ownerdrawfixed; } //重绘项事件 private void combobox2_drawitem(object sender, drawitemeventargs e) { //获取要在其上绘制项的图形表面 graphics g = e.graphics; //获取表示所绘制项的边界的矩形 system.drawing.rectangle rect = e.bounds; //定义要绘制到控件中的图标图像 image ico = image.fromfile("head.png"); //定义字体对象 system.drawing.font font = new system.drawing.font(new fontfamily("宋体"), 12); if (e.index >= 0) { //获得当前item的文本 string tempstring = combobox2.items[e.index].tostring(); //如果当前项是没有状态的普通项 if (e.state == drawitemstate.none) { //在当前项图形表面上划一个矩形 g.fillrectangle(new solidbrush(color.fromargb(200, 230, 255)), rect); //在当前项图形表面上划上图标 g.drawimage(ico, new point(rect.left, rect.top)); //在当前项图形表面上划上当前item的文本 g.drawstring(tempstring, font, new solidbrush(color.black), rect.left + ico.size.width, rect.top); //将绘制聚焦框 e.drawfocusrectangle(); } else { e.graphics.fillrectangle(new solidbrush(color.lightblue), rect); g.drawimage(ico, new point(rect.left, rect.top)); g.drawstring(tempstring, font, new solidbrush(color.black), rect.left + ico.size.width, rect.top); e.drawfocusrectangle(); } } } } }
总结:如果仅仅是美化可以选择使用皮肤控件,但使用重绘更加灵活,可以满足一些功能上的需求。另外不同的控件还有一些不同重绘事件,可以参照msdn。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。