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
(0)

相关推荐

  • C#的winform控件命名规范

    本文详细讲述了C#的winform控件命名规范.分享给大家供大家参考.具体如下: 注:这里用红字标记的部分表示有重复出现,括号内为替代表示方案 1.标准控件 序号 控件类型简写 控件类型 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedT

  • WinForm实现的图片拖拽与缩放功能示例

    本文实例讲述了WinForm实现的图片拖拽与缩放功能.分享给大家供大家参考,具体如下: 最近做项目的时候遇到上传施工平面布置图,查看,因为图片比较大,一般的显示器分辨率无法显示全,然后还需要放大看清楚图片里面的文字内容,所以需要用到图片的拖拽与缩放功能.这里整理下具体操作. 首先新建一个窗体,拖一个panel控件到窗体中,然后在拖一个pictureobx控件到panel中,然后在添加个上传图片的按钮: 具体代码: using System; using System.Collections.Ge

  • winform实现拖动文件到窗体上的方法

    本文实例讲述了winform实现拖动文件到窗体上的方法.分享给大家供大家参考.具体如下: private void Form5_Load(object sender, EventArgs e) { this.AllowDrop=true; } private void Form5_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files

  • WinForm子窗体访问父窗体控件的实现方法

    Form1主窗体: 复制代码 代码如下: public delegate void SetVisiableHandler();//定义委托类型 private void button1_Click(object sender,EventArgs e)//单击事件,打开子窗体{    Form2 frm = new Form2(new SetVisiableHandler(SetVisiable));    frm.Show();} private void SetVisiable(){    d

  • C#中WinForm控件的拖动和缩放的实现代码

    C# WinForm控件的拖动和缩放是个很有用的功能.实现起来其实很简单的,主要是设计控件的MouseDown.MouseLeave.MouseMove事件,下面的几个步骤将逐步实现C# WinForm控件的拖动和缩放的功能. 1.定义一个枚举类型,描述光标状态 private enum EnumMousePointPosition { MouseSizeNone = 0, //'无 MouseSizeRight = 1, //'拉伸右边框 MouseSizeLeft = 2, //'拉伸左边框

  • C# WinForm实现窗体上控件自由拖动功能示例

    本文实例讲述了C# WinForm实现窗体上控件自由拖动功能.分享给大家供大家参考,具体如下: 说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

  • WinForm拖拽控件生成副本的解决方法

    本文讲述了WinForm中实现拖拽效果的功能,即在WinForm中有一个Button,可以实现拖拽这个Button到目标位置后生成一个该控件的副本的功能.具体操作步骤如下: 要实现该功能主要分成如下三步: 1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop--该函数接受两个参数:i)要拖动的数据.ii)拖动的效果(该效果是2"目标位置"所能够接受的效果,是一个枚举值): C#代码如下: B

  • WinForm实现移除控件某个事件的方法

    本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary> /// 移除控件某个事件 /// </summary> /// <param name="control">控件</param> /// <param name="eventName">需要移除的控件名称eg:EventClick</param> p

  • C# Winform 让整个窗口都可以拖动

    今天在网上查一些资料的时候, 无意中发现另一种办法, 非常方便, 调用系统的 API 来实现的, 效果也很好. 赶紧收藏了~ 复制代码 代码如下: [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int

  • C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法

    本文实例讲述了C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法.分享给大家供大家参考,具体如下: winform 程序运行过程中,用户用鼠标拖动窗体大小时,如将窗体调整得极小,可能窗体上的控件就面目全非(或看不到了),用下面的代码可以设定窗口的最小尺寸,以防止这种情况 private void Form1_ResizeEnd(object sender, EventArgs e) { //this.Text = "2width:" + this.Width.ToStrin

随机推荐