查看: 1783|回复: 0

[ASP.NET教程] 使用重绘项美化WinForm的控件

发表于 2018-1-3 08:00:01

如果你觉得项目中的ComboBox、ListBox或其它的Winforms控件不能满足你的显示要求,包括窗体在内很多控件都支持重绘修改显示样式。下面的示例完成对ComBox数据项的重绘,希望能起到抛砖引玉的作用。

显示源代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace SimpleDemo
  10. {
  11. public partial class frmDrawItem : Form
  12. {
  13. public frmDrawItem()
  14. {
  15. InitializeComponent();
  16. //指定绘制模式,这项必须指定为,OwnerDrawFixed,OwnerDrawVariable
  17. //Normal 由操作系统绘制,并且元素大小都相等。
  18. //OwnerDrawFixed 手动绘制的,并且元素大小都相等。
  19. //OwnerDrawVariable 手动绘制,元素大小可能不相等。
  20. comboBox2.DrawMode = DrawMode.OwnerDrawFixed;
  21. }
  22. //重绘项事件
  23. private void comboBox2_DrawItem(object sender, DrawItemEventArgs e)
  24. {
  25. //获取要在其上绘制项的图形表面
  26. Graphics g = e.Graphics;
  27. //获取表示所绘制项的边界的矩形
  28. System.Drawing.Rectangle rect = e.Bounds;
  29. //定义要绘制到控件中的图标图像
  30. Image ico = Image.FromFile("head.png");
  31. //定义字体对象
  32. System.Drawing.Font font = new System.Drawing.Font(new FontFamily("宋体"), 12);
  33. if (e.Index >= 0)
  34. {
  35. //获得当前Item的文本
  36. string tempString = comboBox2.Items[e.Index].ToString();
  37. //如果当前项是没有状态的普通项
  38. if (e.State == DrawItemState.None)
  39. {
  40. //在当前项图形表面上划一个矩形
  41. g.FillRectangle(new SolidBrush(Color.FromArgb(200, 230, 255)), rect);
  42. //在当前项图形表面上划上图标
  43. g.DrawImage(ico, new Point(rect.Left, rect.Top));
  44. //在当前项图形表面上划上当前Item的文本
  45. g.DrawString(tempString, font, new SolidBrush(Color.Black), rect.Left + ico.Size.Width, rect.Top);
  46. //将绘制聚焦框
  47. e.DrawFocusRectangle();
  48. }
  49. else
  50. {
  51. e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue), rect);
  52. g.DrawImage(ico, new Point(rect.Left, rect.Top));
  53. g.DrawString(tempString, font, new SolidBrush(Color.Black), rect.Left + ico.Size.Width, rect.Top);
  54. e.DrawFocusRectangle();
  55. }
  56. }
  57. }
  58. }
  59. }
复制代码

总结:如果仅仅是美化可以选择使用皮肤控件,但使用重绘更加灵活,可以满足一些功能上的需求。另外不同的控件还有一些不同重绘事件,可以参照MSDN。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。



回复

使用道具 举报