zoukankan      html  css  js  c++  java
  • C# winform combobox控件中子项加删除按钮(原创)

    效果如下图,本人网上搜索资料加上自己的研究终于实现了在combobox子项中加上删除按钮。

    一、窗体中的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Drawing.Drawing2D;
    
    namespace ComboBoxEx
    {
        public partial class Form1 : Form
        {
            [DllImport("user32")]
            private static extern int GetComboBoxInfo(IntPtr hwnd, out COMBOBOXINFO comboInfo);
            struct RECT
            {
                public int left, top, right, bottom;
            }
            struct COMBOBOXINFO
            {
                public int cbSize;
                public RECT rcItem;
                public RECT rcButton;
                public int stateButton;
                public IntPtr hwndCombo;
                public IntPtr hwndItem;
                public IntPtr hwndList;
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
                comboBox1.Items.Add(new comboItem("sgset", pictureBox1.Image));
                comboBox1.Items.Add(new comboItem("sdgsdg", pictureBox1.Image));
                comboBox1.Items.Add(new comboItem("sdgsdg", pictureBox1.Image));
            }
            public Form1()
            {
                InitializeComponent();
                comboBox1.HandleCreated += (s, e) =>
                {
                    COMBOBOXINFO combo = new COMBOBOXINFO();
                    combo.cbSize = Marshal.SizeOf(combo);
                    GetComboBoxInfo(comboBox1.Handle, out combo);
                    hwnd = combo.hwndList;
                    init = false;
                };
            }
            bool init;
            IntPtr hwnd;
            NativeCombo nativeCombo = new NativeCombo();
            //This is to store the Rectangle info of your Icons
            //Key:  the Item index
            //Value: the Rectangle of the Icon of the item (not the Rectangle of the item)
            Dictionary<int, Rectangle> dict = new Dictionary<int, Rectangle>();
            public class NativeCombo : NativeWindow
            {
                //this is custom MouseDown event to hook into later
                public event MouseEventHandler MouseDown;
                protected override void WndProc(ref Message m)
                {
                    if (m.Msg == 0x201)//WM_LBUTTONDOWN = 0x201
                    {
                        int x = m.LParam.ToInt32() & 0x00ff;
                        int y = m.LParam.ToInt32() >> 16;
                        if (MouseDown != null) MouseDown(null, new MouseEventArgs(MouseButtons.Left, 1, x, y, 0));
                    }
                    base.WndProc(ref m);
                }
            }
            private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
                
                if ((e.State & DrawItemState.Selected) != 0)//鼠标选中在这个项上
                {
                    //渐变画刷
                    LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, Color.FromArgb(255, 251, 237),
                                                     Color.FromArgb(255, 236, 181), LinearGradientMode.Vertical);
                    //填充区域
                    Rectangle borderRect = new Rectangle(0, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height - 2);
                    e.Graphics.FillRectangle(brush, borderRect);
                    //画边框
                    Pen pen = new Pen(Color.FromArgb(229, 195, 101));
                    e.Graphics.DrawRectangle(pen, borderRect);
                }
                else
                {
                    SolidBrush brush = new SolidBrush(Color.FromArgb(217, 223, 230));
                    e.Graphics.FillRectangle(brush, e.Bounds);
                }
                //获得项图片,绘制图片
                comboItem item = (comboItem)comboBox1.Items[e.Index];
                Image img = item.Img;
    
                //图片绘制的区域
                Rectangle imgRect = new Rectangle(e.Bounds.Width - 18, e.Bounds.Y, 15, 15);
                dict[e.Index] = imgRect;
                if (img != null && (e.State & DrawItemState.Selected) != 0)
                {
                    e.Graphics.DrawImage(img, imgRect);
                }
                Rectangle textRect =
                    new Rectangle(10, imgRect.Y, e.Bounds.Width - imgRect.Width, e.Bounds.Height + 2);
                string itemText = comboBox1.Items[e.Index].ToString();
                StringFormat strFormat = new StringFormat();
                strFormat.LineAlignment = StringAlignment.Center;
                e.Graphics.DrawString(itemText, new Font("宋体", 14), Brushes.Black, textRect, strFormat);
    
            }
    
            private void comboBox1_DropDown(object sender, EventArgs e)
            {
                if (!init)
                {
                    //Register the MouseDown event handler <--- THIS is WHAT you want.
                    nativeCombo.MouseDown += comboListMouseDown;
                    nativeCombo.AssignHandle(hwnd);
                    init = true;
                }
            }
    
            //This is the MouseDown event handler to handle the clicked icon
            private void comboListMouseDown(object sender, MouseEventArgs e)
            {
                foreach (var kv in dict)
                {
                    if (kv.Value.Contains(e.Location))
                    {
                        //Show the item index whose the corresponding icon was held down
                        MessageBox.Show(kv.Key.ToString());
                        return;
                    }
                }
            }
        }
    }

    二、子项辅助类

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    
    namespace ComboBoxEx
    {
        public class comboItem : object
        {
            private Image img = null;
            private string text = null;
    
            public comboItem()
            {
    
            }
    
            public comboItem(string text)
            {
                Text = text;
            }
    
            public comboItem(string text,Image img)
            {
                Text = text;
                Img = img;
            }
    
            // item Img
            public Image Img
            {
                get
                {
                    return img;
                }
                set
                {
                    img = value;
                }
            }
    
            // item text
            public string Text
            {
                get
                {
                    return text;
                }
                set
                {
                    text = value;
                }
            }
    
            // ToString() should return item text
            public override string ToString()
            {
                return text;
            }
        }
    }
  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/ding2011/p/5122117.html
Copyright © 2011-2022 走看看