视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用重绘项美化WinForm的控件
2020-11-27 22:35:20 责编:小采
文档


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

显示源代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SimpleDemo
{
 public partial class frmDrawItem : Form
 {
 public frmDrawItem()
 {
 InitializeComponent();
 //指定绘制模式,这项必须指定为,OwnerDrawFixed,OwnerDrawVariable
 //Normal 由操作系统绘制,并且元素大小都相等。 
 //OwnerDrawFixed 手动绘制的,并且元素大小都相等。 
 //OwnerDrawVariable 手动绘制,元素大小可能不相等。 
 comboBox2.DrawMode = DrawMode.OwnerDrawFixed;
 }

 //重绘项事件
 private void comboBox2_DrawItem(object sender, DrawItemEventArgs e)
 {
 //获取要在其上绘制项的图形表面
 Graphics g = e.Graphics;
 //获取表示所绘制项的边界的矩形
 System.Drawing.Rectangle rect = e.Bounds;
 //定义要绘制到控件中的图标图像
 Image ico = Image.FromFile("head.png");
 //定义字体对象
 System.Drawing.Font font = new System.Drawing.Font(new FontFamily("宋体"), 12);
 if (e.Index >= 0)
 {
 //获得当前Item的文本
 string tempString = comboBox2.Items[e.Index].ToString();
 //如果当前项是没有状态的普通项
 if (e.State == DrawItemState.None)
 {
 //在当前项图形表面上划一个矩形
 g.FillRectangle(new SolidBrush(Color.FromArgb(200, 230, 255)), rect);
 //在当前项图形表面上划上图标
 g.DrawImage(ico, new Point(rect.Left, rect.Top));
 //在当前项图形表面上划上当前Item的文本
 g.DrawString(tempString, font, new SolidBrush(Color.Black), rect.Left + ico.Size.Width, rect.Top);
 //将绘制聚焦框
 e.DrawFocusRectangle();
 }
 else
 {
 e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue), rect);
 g.DrawImage(ico, new Point(rect.Left, rect.Top));
 g.DrawString(tempString, font, new SolidBrush(Color.Black), rect.Left + ico.Size.Width, rect.Top);
 e.DrawFocusRectangle();
 }
 }
 }

 }
}


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

下载本文
显示全文
专题