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,如需转载请自行联系原作者

相关文章
|
8天前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
|
8天前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
|
8天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
8天前
|
人工智能 C# 开发者
C#编程中的图形界面设计
【4月更文挑战第21天】本文探讨了C#在GUI设计中的应用,介绍了Windows Forms、WPF和UWP等常用框架,强调了简洁界面、响应式设计和数据绑定等最佳实践。通过实际案例,展示了C#在企业应用、游戏开发和移动应用中的GUI实现。随着技术发展,C#在GUI设计的未来将趋向于跨平台、更丰富的组件和AI集成,为开发者创造更多可能性。
|
8天前
|
存储 算法 C#
C#编程与数据结构的结合
【4月更文挑战第21天】本文探讨了C#如何结合数据结构以构建高效软件,强调数据结构在C#中的重要性。C#作为面向对象的编程语言,提供内置数据结构如List、Array和Dictionary,同时也支持自定义数据结构。文章列举了C#实现数组、链表、栈、队列等基础数据结构的示例,并讨论了它们在排序、图算法和数据库访问等场景的应用。掌握C#数据结构有助于编写高性能、可维护的代码。
|
8天前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
30 0
|
8天前
|
开发框架 Linux C#
C#编程的跨平台应用
【4月更文挑战第21天】C#与.NET Core的结合使得跨平台应用开发变得高效便捷,提供统一编程模型和高性能。丰富的类库、活跃的社区支持及Visual Studio Code、Xamarin等工具强化了其优势。广泛应用在企业系统、云服务和游戏开发中,虽面临挑战,但随着技术进步,C#在跨平台开发领域的前景广阔。
|
8天前
|
人工智能 C# 云计算
C#编程的未来发展趋向
【4月更文挑战第21天】C#编程未来将深化跨平台支持,强化云计算与容器技术集成,如.NET Core、Docker。在AI和ML领域,C#将提供更丰富框架,与AI芯片集成。语言和工具将持续创新,优化异步编程,如Task、async和await,提升多核性能。开源生态的壮大将吸引更多开发者,共创更多机遇。
|
8天前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
|
8天前
|
开发框架 安全 .NET
C#编程高手的成长之路
【4月更文挑战第21天】本文揭示了成为C#编程高手的路径:牢固掌握基础知识和面向对象编程,深入了解C#特性如泛型和委托,精通ASP.NET等框架工具,养成良好编程习惯,持续学习实践并参与开源项目,勇于挑战创新。通过这些步骤,不断提升编程技能,迈向C#编程的巅峰。