欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用重绘项美化WinForm的控件

程序员文章站 2022-07-03 19:21:55
如果你觉得项目中的combobox、listbox或其它的winforms控件不能满足你的显示要求,包括窗体在内很多控件都支持重绘修改显示样式。下面的示例完成对combox...

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

使用重绘项美化WinForm的控件

显示源代码

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。

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