欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WinForm自定义控件应用实例

程序员文章站 2024-02-19 22:12:40
c#的winform有一些控件具备自绘的功能,这就意味着你可以对这些控件进行自绘,可以起到意想不到的视觉效果。本文所述的以下控件就是通过一些简单的控件转变过来的。具体示例如...

c#的winform有一些控件具备自绘的功能,这就意味着你可以对这些控件进行自绘,可以起到意想不到的视觉效果。本文所述的以下控件就是通过一些简单的控件转变过来的。具体示例如下:

1、横向选项卡重绘:

WinForm自定义控件应用实例

这里的“横向”对话框其实是通过一个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、颜色选项卡重绘:

WinForm自定义控件应用实例

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