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
相关文章
- 本篇文章是对C#中WinForm控件之Dock顺序调整进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了C# Winform中实现主窗口打开登录窗口关闭的方法,这在需要用户名密码的软件项目中是必用的一个技巧,要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇C# winform打开Excel文档的方法总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要给大家介绍C# winform快捷键设置技巧,涉及到C winform快捷键相关知识,对C winform知识感兴趣的朋友可以参考下本篇文章...2020-06-25
c#中Winform实现多线程异步更新UI(进度及状态信息)
本篇文章主要介绍了c#中Winform实现多线程异步更新UI(进度及状态信息) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#中winform使用相对路径读取文件的方法,实例分析了C#使用相对路径读取文件的技巧与实际应用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要给大家介绍了关于c# winform异步不卡界面的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 本篇文章是对C#中自定义控件的制作与使用实例进行了详细的分析介绍,需要的朋友参考下...2020-06-25
C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法
这篇文章主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下...2020-06-25winform中的ListBox和ComboBox绑定数据用法实例
这篇文章主要介绍了winform中的ListBox和ComboBox绑定数据用法,实例分析了将集合数据绑定到ListBox和ComboBox控件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了C#在Winform开发中使用Grid++报表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要为大家详细介绍了C# WinForm程序设计简单计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了C#自定义控件添加右键菜单的方法,本文用到control控件,专门自定义右键菜单,下面小编给大家整理下,有需要的小伙伴可以来参考下...2020-06-25
C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法
这篇文章主要介绍了C# WinForm控件对透明图片重叠时出现图片不透明的简单解决方法,结合实例形式分析了WinForm图片重叠后造成图片不透明的原因与相应的解决方法,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了C#实现Winform中打开网页页面的方法,涉及WinForm中WebBrowser的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 在工作中遇到这样一个问题,在系统使用过程中,输入法会变灰导致无法使用输入法输入文字,就好像输入法被禁用了没有启用似的。对此,在这里做个备录...2020-06-25
C#实现winform中RichTextBox在指定光标位置插入图片的方法
这篇文章主要介绍了C#实现winform中RichTextBox在指定光标位置插入图片的方法,涉及RichTextBox控件及剪切板的相关操作技巧,非常简单实用,需要的朋友可以参考下...2020-06-25C# Winform 调用系统接口操作 INI 配置文件的代码
封装了一小段代码, 调用系统接口, 操作配置文件. 一般用于 .ini 文件, 或者其它键值对格式的配置文件...2020-06-25- 这篇文章主要介绍了WinForm调用百度地图接口用法,结合具体实例形式简单分析了WinForm WebBrower控件与前端百度接口交互的相关操作技巧,需要的朋友可以参考下...2020-06-25
- 在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式...2020-06-25