使用重绘项美化WinForm的控件

如果你觉得项目中的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。

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

(0)

相关推荐

  • 深入分析C#中WinForm控件之Dock顺序调整的详解

    最近被.net winform中的控件布局搞困惑了,由于控件都是使用Dock方式的,操作起来也是比较方便,如果最大化,窗口大小调整等,都可以随着窗口大小的变化而变化.但问题是,.net winform的dock方式是根据先添加的控件顺序进行优先级Dock排列的,假设我想目前有三个控件A.B.C分别以 Top.Bottom以及Fill方式填充窗口即窗口看起来应该是这样的:---------------------A---------------------C--------------------

  • C#的winform控件命名规范

    本文详细讲述了C#的winform控件命名规范.分享给大家供大家参考.具体如下: 注:这里用红字标记的部分表示有重复出现,括号内为替代表示方案 1.标准控件 序号 控件类型简写 控件类型 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedT

  • C#中让控件全屏显示的实现代码(WinForm)

    1.使用winapi "SetParent" 接口: 复制代码 代码如下: [DllImport("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 复制代码 代码如下: control.Dock = DockStyle.None; control.Left = 0; control.Top = 0; c

  • C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

    特别是针对循环或timer处理中需要在窗体控件显示数据时,因后台处理过度繁忙而出现没刷新或者假死现象时,可以使用 复制代码 代码如下: Application.DoEvents(); Application.DoEvents()的作用 复制代码 代码如下: private void button1_Click(object sender, EventArgs e)         {             for (int i = 0; i < 10000; i++)            

  • WinForm子窗体访问父窗体控件的实现方法

    Form1主窗体: 复制代码 代码如下: public delegate void SetVisiableHandler();//定义委托类型 private void button1_Click(object sender,EventArgs e)//单击事件,打开子窗体{    Form2 frm = new Form2(new SetVisiableHandler(SetVisiable));    frm.Show();} private void SetVisiable(){    d

  • 简介Winform中创建用户控件

    步骤: 1.创建一个项目,该项目主要用来设计用户控件. 2.创建一个用户控件窗体,用来设计用户控件. 3.向用户控件窗体中添加一个按钮(button1),给它添加相应的移入.移出事件,实现移入时按钮的背景设置一个图片,移出的时候背景设置另一个图片. 复制代码 代码如下: private void button1_MouseEnter(object sender, EventArgs e)        {            this.button1.Image = Image.FromFil

  • c#中多线程访问winform控件的若干问题小结

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍. 首先来看传统方法: 复制代码 代码如下: public partial class Form1 : Form     {        public Form1()        {            InitializeComponent();        } private void Form1_Load(object sender,

  • WinForm自定义函数FindControl实现按名称查找控件

    本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值.分享给大家供大家参考. 关键代码如下: /// <summary> /// 按名称查找控件 /// </summary> /// <param name="parentControl">查找控件的父容器控件</param> /// <param name="findCtrlName">查

  • WinForm实现移除控件某个事件的方法

    本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary> /// 移除控件某个事件 /// </summary> /// <param name="control">控件</param> /// <param name="eventName">需要移除的控件名称eg:EventClick</param> p

  • .Net WInform开发笔记(三)谈谈自制控件(自定义控件)

    末日这天写篇博客吧,既然没来,那就纪念一下. 这次谈谈自制控件,也就是自定义控件,先上图,再说 1.扩展OpenFileDialog,在OpenFileDialog中添加各种文件(.txt,.jpg,.excel等等)的预览功能 2.重写ListBox,增加折叠.鼠标背影.分类等功能 -----------------------------分割线--------------------------------------------------------------一.扩展OpenFileD

随机推荐