C# · 12月 26, 2021

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)),New PointF(e.Bounds.X + 5,e.Bounds.Y + 5))End Sub

注意:程序的DrawFocusRectangle和DrawBackGound分别是绘制聚焦虚框和选定一个选项卡之后背景变成蓝色。如果省略则无法呈现选中的效果。

2、颜色选项卡重绘:

Combo@R_360_2419@和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(); combo@R_360_2419@1.DataSource = ColorInfo.GetAllColors(); combo@R_360_2419@1.DisplayMember = “ColorName”; combo@R_360_2419@1.ValueMember = “Color”;}private void combo@R_360_2419@1_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((combo@R_360_2419@1.DataSource as List<ColorInfo>)[e.Index].Color),r); //绘制颜色名称,起始点每项都是Item中(70,5) e.Graphics.DrawString((combo@R_360_2419@1.DataSource as List<ColorInfo>)[e.Index].ColorName,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() combo@R_360_2419@1.DataSource = ColorInfo.GetAllColors() combo@R_360_2419@1.DisplayMember = “ColorName” combo@R_360_2419@1.ValueMember = “Color” End Sub Private Sub combo@R_360_2419@1_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,10) ‘外框是黑色 e.Graphics.DrawRectangle(New Pen(Color.Black),r) ‘内框用枚举出来的颜色填充 e.Graphics.FillRectangle(New SolidBrush(TryCast(combo@R_360_2419@1.DataSource,List(Of ColorInfo))(e.Index).Color),r) ‘绘制颜色名称,起始点每项都是Item中(70,5) e.Graphics.DrawString(TryCast(combo@R_360_2419@1.DataSource,List(Of ColorInfo))(e.Index).ColorName,New PointF(e.Bounds.X + 70,e.Bounds.Y + 5)) End SubEnd Class