为ComboBox控件添加图片

作者: 孟宪会 出自: 【孟宪会之精彩世界】 发布日期: 2003-7-2 17:34:04

.NET自带的ComboBox控件没有添加图片的功能,我们可以自己进行扩展,下面就是扩展类的代码:

结果如下:

img_1

扩展类 ComboBoxEx.cs

using System;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Drawing;

namespace Mengxianhui.ComboBoxEx
{
    class ComboBoxEx : ComboBox
    {
        private ImageList imageList;
        public ImageList ImageList
        {
            get { return imageList; }
            set { imageList = value; }
        }

        public ComboBoxEx()
        {
            DrawMode = DrawMode.OwnerDrawFixed;
        }

        protected override void OnDrawItem(DrawItemEventArgs ea)
        {
            ea.DrawBackground();
            ea.DrawFocusRectangle();

            ComboBoxExItem item;
            Size imageSize = imageList.ImageSize;
            Rectangle bounds = ea.Bounds;

            try
            {
                item = (ComboBoxExItem)Items[ea.Index];

                if (item.ImageIndex != -1)
                {
                    imageList.Draw(ea.Graphics, bounds.Left, bounds.Top,
                      item.ImageIndex);
                    ea.Graphics.DrawString(item.Text, ea.Font, new
                      SolidBrush(ea.ForeColor), bounds.Left + imageSize.Width, bounds.Top);
                }
                else
                {
                    ea.Graphics.DrawString(item.Text, ea.Font, new
                      SolidBrush(ea.ForeColor), bounds.Left, bounds.Top);
                }
            }
            catch
            {
                if (ea.Index != -1)
                {
                    ea.Graphics.DrawString(Items[ea.Index].ToString(), ea.Font, new
                      SolidBrush(ea.ForeColor), bounds.Left, bounds.Top);
                }
                else
                {
                    ea.Graphics.DrawString(Text, ea.Font, new
                      SolidBrush(ea.ForeColor), bounds.Left, bounds.Top);
                }
            }
            base.OnDrawItem(ea);
        }
    }

    class ComboBoxExItem
    {
        private string _text;
        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }

        private int _imageIndex;
        public int ImageIndex
        {
            get { return _imageIndex; }
            set { _imageIndex = value; }
        }

        public ComboBoxExItem() : this("")
        {
        }

        public ComboBoxExItem(string text) : this(text, -1)
        {
        }

        public ComboBoxExItem(string text, int imageIndex)
        {
            _text = text;
            _imageIndex = imageIndex;
        }

        public override string ToString()
        {
            return _text;
        }
    }
}

使用方法

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Mengxianhui.ComboBoxEx
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private ComboBoxEx comboBox1;
        private System.ComponentModel.IContainer components;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            ComboBoxEx comboBox1 = new ComboBoxEx();
            ImageList imageList1 = new ImageList();
            imageList1.Images.Add(Image.FromFile(@"D:\favicon.ico"));
            imageList1.Images.Add(Image.FromFile(@"D:\favicon4.ico"));
            imageList1.Images.Add(Image.FromFile(@"D:\favicon5.ico"));
            comboBox1.ImageList = imageList1;

            comboBox1.Width = 200;

            comboBox1.Items.Add(new ComboBoxExItem("【孟宪会之精彩世界】", 0));
            comboBox1.Items.Add(new ComboBoxExItem("【孟宪会之精彩世界】", 1));
            comboBox1.Items.Add(new ComboBoxExItem("【孟宪会之精彩世界】", 2));
            this.Controls.AddRange(new System.Windows.Forms.Control[] {comboBox1});

            // 
            // Form1
            //</FONT> 
            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {comboBox1});
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());        
        }
    }
}
Contributors: FHL