C# Winform编程ListBox之DrawItem事件

简介:

 新建一个winform项目,拖一个ListBox控件listBox1

 

 

 
 
  1. public Form1() 
  2.  
  3.  
  4.     InitializeComponent();             
  5.  
  6.     listBox1.DrawMode = DrawMode.OwnerDrawFixed; 
  7.  

首先需要设置DrawMode为DrawMode.OwnerDrawFixed 或 DrawMode.OwnerDrawVariable 时,才触发该事件(DrawItem事件).,也可以通过设计器在属性面板里设置哈。

 

 
 
  1. private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
  2.     e.DrawBackground();//绘制背景 
  3.     Brush myBrush = Brushes.Black; 
  4.  
  5.     switch (e.Index) 
  6.     { 
  7.         case 0: 
  8.             myBrush = Brushes.Red; 
  9.             break
  10.         case 1: 
  11.             myBrush = Brushes.Orange; 
  12.             break
  13.         case 2: 
  14.             myBrush = Brushes.Purple; 
  15.             break
  16.     } 
  17.     e.DrawFocusRectangle();//焦点框 
  18.  
  19.     //文本 
  20.     e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, myBrush, e.Bounds, StringFormat.GenericDefault); 

这是采用附加委托的方式处理,可以查看设计器产生的代码:

 

 
 
  1. this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem); 

事件由ListBox触发.

下面,再举一反三下,实现交替颜色的列表框:

 

 
 
  1. public partial class Form1 : Form 
  2.     private Color RowBackColorAlt=Color.FromArgb(200,200,200);//交替色 
  3.     private Color RowBackColorSel = Color.FromArgb(150, 200, 250);//选择项目颜色 
  4.  
  5.     public Form1() 
  6.     { 
  7.         InitializeComponent();             
  8.         listBox1.DrawMode = DrawMode.OwnerDrawFixed; 
  9.     } 
  10.  
  11.     private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
  12.     { 
  13.         Brush myBrush = Brushes.Black; 
  14.  
  15.         if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
  16.         { 
  17.             myBrush = new SolidBrush(RowBackColorSel); 
  18.         } 
  19.         else if (e.Index % 2 == 0) 
  20.         { 
  21.             myBrush = new SolidBrush(RowBackColorAlt); 
  22.         } 
  23.         else 
  24.         { 
  25.             myBrush = new SolidBrush(Color.White); 
  26.         } 
  27.         e.Graphics.FillRectangle(myBrush, e.Bounds); 
  28.         e.DrawFocusRectangle();//焦点框 
  29.  
  30.         //文本 
  31.         e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault); 
  32.     } 
  33.  

上图:

 

 

 接下来,设置ItemHeight,每一项的高度:

 

 
 
  1. public Form1() 
  2.     InitializeComponent();             
  3.     listBox1.DrawMode = DrawMode.OwnerDrawFixed; 
  4.     listBox1.ItemHeight = 24; 

文字,剧中:

 

 
 
  1. //文本 
  2. StringFormat strFormat = new StringFormat(); 
  3. strFormat.Alignment = StringAlignment.Center; 
  4. strFormat.LineAlignment = StringAlignment.Center; 
  5. e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds,strFormat); 

上图片:

 

 下面看看MeasureItem 事件:

仅当 DrawMode 属性被设置为 OwnerDrawVariable 时,才引发该事件。

 
 
  1. public partial class Form1 : Form 
  2.     private Color RowBackColorAlt=Color.FromArgb(200,200,200);//交替色 
  3.     private Color RowBackColorSel = Color.FromArgb(150, 200, 250);//选择项目颜色 
  4.  
  5.     public Form1() 
  6.     { 
  7.         InitializeComponent();             
  8.         listBox1.DrawMode = DrawMode.OwnerDrawVariable; 
  9.     } 
  10.  
  11.     private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
  12.     { 
  13.         Brush myBrush = Brushes.Black; 
  14.  
  15.         if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
  16.         { 
  17.             myBrush = new SolidBrush(RowBackColorSel); 
  18.         } 
  19.         else if (e.Index % 2 == 0) 
  20.         { 
  21.             myBrush = new SolidBrush(RowBackColorAlt); 
  22.         } 
  23.         else 
  24.         { 
  25.             myBrush = new SolidBrush(Color.White); 
  26.         } 
  27.         e.Graphics.FillRectangle(myBrush, e.Bounds); 
  28.         e.DrawFocusRectangle();//焦点框 
  29.  
  30.         //文本 
  31.         StringFormat strFormat = new StringFormat(); 
  32.         strFormat.Alignment = StringAlignment.Center; 
  33.         strFormat.LineAlignment = StringAlignment.Center; 
  34.         e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds,strFormat); 
  35.     } 
  36.  
  37.     private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) 
  38.     { 
  39.         e.ItemHeight = (1+e.Index)*12; 
  40.     } 
  41.  

 



 本文转自 xcf007 51CTO博客,原文链接:http://blog.51cto.com/xcf007/429339,如需转载请自行联系原作者

相关文章
|
5月前
|
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
94 3
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
100 12
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
176 12
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
210 4
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
542 0
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
342 0
|
6月前
|
【C#】在winform中如何实现嵌入第三方软件窗体
【C#】在winform中如何实现嵌入第三方软件窗体
338 0
|
6月前
|
C#实现Winform程序右下角弹窗消息提示
C#实现Winform程序右下角弹窗消息提示
314 0
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
306 3
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
261 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等