WinForm自定义控件应用实例
c#的winform有一些控件具备自绘的功能,这就意味着你可以对这些控件进行自绘,可以起到意想不到的视觉效果。本文所述的以下控件就是通过一些简单的控件转变过来的。具体示例如下:
1、横向选项卡重绘:
这里的“横向”对话框其实是通过一个tabcontrol进行“方向旋转”、重绘控件项等操作进行实现的。步骤如下:
①.alignment:用于控制选项卡的方向(设置为left)。
②.sizemode:用于调整每个选项卡,默认是normal(非自绘模式),此处应该设置为fixed(固定模式),则允许自绘。
③.设置itemsize(注意每一个选项卡因为是“横向”的,但是这些单元卡的width或者是height确实按照原来“竖向”的选项卡进行处理的。因此height其实是横向选项卡的“宽度”,而width确实选项卡的“高度”,注意不要混淆)。
④.最后重绘drawitem,这一步也就是最重要的(为了显示文字)。每次draw_item会在创建了tabpage之后被调用。此时你应该设定绘制文字的起始点(定义x,y)。
具体实现代码如下:
c#部分代码:
private void tabcontrol1_drawitem(object sender, drawitemeventargs e) { e.drawfocusrectangle(); e.drawbackground(); e.graphics.drawstring("标签" + (e.index + 1), systemfonts.defaultfont, brushes.black, new pointf(e.bounds.x + 5, e.bounds.y + 5)); }
vb.net页面部分代码:
private sub tabcontrol1_drawitem(sender as object, e as drawitemeventargs) e.drawfocusrectangle() e.drawbackground() e.graphics.drawstring("标签" & convert.tostring((e.index + 1)), systemfonts.defaultfont, brushes.black, new pointf(e.bounds.x + 5, e.bounds.y + 5)) end sub
注意:程序的drawfocusrectangle和drawbackgound分别是绘制聚焦虚框和选定一个选项卡之后背景变成蓝色。如果省略则无法呈现选中的效果。
2、颜色选项卡重绘:
combobox和tabcontrol一样每一个item都可以重绘。重要属性如下:
①.itemheight:设置每项项目的重绘高度。
②.drawmode:重绘样式(分为:normal一般模式,不支持重绘;ownerdrawfixed:自绘模式,固定高度,ownerdrawvariable:自绘模式,可以在mesureitem中重新为每一项调整高度进行绘制)。
③.重绘draw_item。
全部代码如下:
c#部分代码:
public partial class form1 : form { /// <summary> /// 绑定下拉列表的color类 /// </summary> private class colorinfo { /// <summary> /// 颜色名称 /// </summary> public string colorname { get; set; } /// <summary> /// 对应的color实体 /// </summary> public color color { get; set; } public static list<colorinfo> getallcolors() { color c = new color(); list<colorinfo> colors = new list<colorinfo>(); foreach (var item in c.gettype().getproperties()) { //排除非颜色的情况 if (item.getvalue(c, null) is color) { colors.add(new colorinfo { colorname = item.name, color = (color)item.getvalue(c, null) }); } } return colors; } } public form1() { initializecomponent(); combobox1.datasource = colorinfo.getallcolors(); combobox1.displaymember = "colorname"; combobox1.valuemember = "color"; } private void combobox1_drawitem(object sender, drawitemeventargs e) { e.drawbackground(); e.drawfocusrectangle(); //绘制空心矩形框,起始点(0,5),宽度60,高度10 rectangle r = new rectangle(e.bounds.x, e.bounds.y+5, 60, 10); //外框是黑色 e.graphics.drawrectangle(new pen(color.black),r); //内框用枚举出来的颜色填充 e.graphics.fillrectangle(new solidbrush((combobox1.datasource as list<colorinfo>)[e.index].color), r); //绘制颜色名称,起始点每项都是item中(70,5) e.graphics.drawstring((combobox1.datasource as list<colorinfo>)[e.index].colorname, systemfonts.defaultfont, brushes.black, new pointf(e.bounds.x + 70, e.bounds.y + 5)); } }
vb.net页面部分代码:
public partial class form1 inherits form ''' <summary> ''' 绑定下拉列表的color类 ''' </summary> private class colorinfo ''' <summary> ''' 颜色名称 ''' </summary> public property colorname() as string get return m_colorname end get set m_colorname = value end set end property private m_colorname as string ''' <summary> ''' 对应的color实体 ''' </summary> public property color() as color get return m_color end get set m_color = value end set end property private m_color as color public shared function getallcolors() as list(of colorinfo) dim c as new color() dim colors as new list(of colorinfo)() for each item as var in c.[gettype]().getproperties() '排除非颜色的情况 if typeof item.getvalue(c, nothing) is color then colors.add(new colorinfo() with { _ key .colorname = item.name, _ key .color = directcast(item.getvalue(c, nothing), color) _ }) end if next return colors end function end class public sub new() initializecomponent() combobox1.datasource = colorinfo.getallcolors() combobox1.displaymember = "colorname" combobox1.valuemember = "color" end sub private sub combobox1_drawitem(sender as object, e as drawitemeventargs) e.drawbackground() e.drawfocusrectangle() '绘制空心矩形框,起始点(0,5),宽度60,高度10 dim r as new rectangle(e.bounds.x, e.bounds.y + 5, 60, 10) '外框是黑色 e.graphics.drawrectangle(new pen(color.black), r) '内框用枚举出来的颜色填充 e.graphics.fillrectangle(new solidbrush(trycast(combobox1.datasource, list(of colorinfo))(e.index).color), r) '绘制颜色名称,起始点每项都是item中(70,5) e.graphics.drawstring(trycast(combobox1.datasource, list(of colorinfo))(e.index).colorname, systemfonts.defaultfont, brushes.black, new pointf(e.bounds.x + 70, e.bounds.y + 5)) end sub end class