WinForm自定義控件應(yīng)用實(shí)例
C#的WinForm有一些控件具備自繪的功能,這就意味著你可以對這些控件進(jìn)行自繪,可以起到意想不到的視覺效果。本文所述的以下控件就是通過一些簡單的控件轉(zhuǎn)變過來的。具體示例如下:
1、橫向選項(xiàng)卡重繪:

這里的“橫向”對話框其實(shí)是通過一個(gè)TabControl進(jìn)行“方向旋轉(zhuǎn)”、重繪控件項(xiàng)等操作進(jìn)行實(shí)現(xiàn)的。步驟如下:
①.Alignment:用于控制選項(xiàng)卡的方向(設(shè)置為Left)。
②.SizeMode:用于調(diào)整每個(gè)選項(xiàng)卡,默認(rèn)是Normal(非自繪模式),此處應(yīng)該設(shè)置為Fixed(固定模式),則允許自繪。
③.設(shè)置ItemSize(注意每一個(gè)選項(xiàng)卡因?yàn)槭恰皺M向”的,但是這些單元卡的Width或者是Height確實(shí)按照原來“豎向”的選項(xiàng)卡進(jìn)行處理的。因此Height其實(shí)是橫向選項(xiàng)卡的“寬度”,而Width確實(shí)選項(xiàng)卡的“高度”,注意不要混淆)。
④.最后重繪DrawItem,這一步也就是最重要的(為了顯示文字)。每次Draw_Item會在創(chuàng)建了TabPage之后被調(diào)用。此時(shí)你應(yīng)該設(shè)定繪制文字的起始點(diǎn)(定義X,Y)。
具體實(shí)現(xiàn)代碼如下:
C#部分代碼:
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawFocusRectangle();
e.DrawBackground();
e.Graphics.DrawString("標(biāo)簽" + (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("標(biāo)簽" & Convert.ToString((e.Index + 1)), SystemFonts.DefaultFont, Brushes.Black, New PointF(e.Bounds.X + 5, e.Bounds.Y + 5))
End Sub
注意:程序的DrawFocusRectangle和DrawBackGound分別是繪制聚焦虛框和選定一個(gè)選項(xiàng)卡之后背景變成藍(lán)色。如果省略則無法呈現(xiàn)選中的效果。
2、顏色選項(xiàng)卡重繪:

Combobox和TabControl一樣每一個(gè)Item都可以重繪。重要屬性如下:
①.ItemHeight:設(shè)置每項(xiàng)項(xiàng)目的重繪高度。
②.DrawMode:重繪樣式(分為:Normal一般模式,不支持重繪;OwnerDrawFixed:自繪模式,固定高度,OwnerDrawVariable:自繪模式,可以在MesureItem中重新為每一項(xiàng)調(diào)整高度進(jìn)行繪制)。
③.重繪Draw_Item。
全部代碼如下:
C#部分代碼:
public partial class Form1 : Form
{
/// <summary>
/// 綁定下拉列表的Color類
/// </summary>
private class ColorInfo
{
/// <summary>
/// 顏色名稱
/// </summary>
public string ColorName { get; set; }
/// <summary>
/// 對應(yīng)的Color實(shí)體
/// </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();
//繪制空心矩形框,起始點(diǎn)(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);
//內(nèi)框用枚舉出來的顏色填充
e.Graphics.FillRectangle(new SolidBrush((comboBox1.DataSource as List<ColorInfo>)[e.Index].Color), r);
//繪制顏色名稱,起始點(diǎn)每項(xiàng)都是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>
''' 對應(yīng)的Color實(shí)體
''' </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()
'繪制空心矩形框,起始點(diǎn)(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)
'內(nèi)框用枚舉出來的顏色填充
e.Graphics.FillRectangle(New SolidBrush(TryCast(comboBox1.DataSource, List(Of ColorInfo))(e.Index).Color), r)
'繪制顏色名稱,起始點(diǎn)每項(xiàng)都是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
相關(guān)文章
詳解C#如何實(shí)現(xiàn)一個(gè)安全的事件訂閱器
事件訂閱器是一個(gè)對象,它訂閱(或監(jiān)聽)某個(gè)事件,并在事件發(fā)生時(shí)執(zhí)行相應(yīng)的操作,本文主要介紹了C#實(shí)現(xiàn)一個(gè)安全的事件訂閱器的相關(guān)知識,感興趣的可以了解下2024-01-01
基于C#后臺調(diào)用跨域MVC服務(wù)及帶Cookie驗(yàn)證的實(shí)現(xiàn)
本篇文章介紹了,基于C#后臺調(diào)用跨域MVC服務(wù)及帶Cookie驗(yàn)證的實(shí)現(xiàn)。需要的朋友參考下2013-04-04
C#實(shí)現(xiàn)用于操作wav聲音文件的類實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)用于操作wav聲音文件的類,實(shí)例分析了C#操作wav音頻文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C# Char結(jié)構(gòu)中IsLetterOrDigit(Char)的方法詳解
這篇文章給大家介紹了C#的Char 結(jié)構(gòu)的IsLetterOrDigit(Char)的方法,并通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02

