zoukankan      html  css  js  c++  java
  • 使用重绘项美化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(200230255)), 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。

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/best/p/2129900.html
Copyright © 2011-2022 走看看