当前位置: 移动技术网 > IT编程>开发语言>c# > WinForm自定义控件应用实例

WinForm自定义控件应用实例

2019年07月18日  | 移动技术网IT编程  | 我要评论
c#的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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网