Base pour un dropdownbutton (winform)

Contenu du snippet

Suite à question sur le forum, une base de contrôle bouton avec un bouton "combo" à droite.
(style bouton dans la boite d'ouverture dans Visual etc)

Code d'un CustomControl a c/c dans un fichier "DropDownButton.cs" par exemple.

Source / Exemple :


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

namespace WindowsApplication1
{
    public class DropDownButton : System.Windows.Forms.Control
    {
        /// <summary>
        /// Variable nécessaire au concepteur.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public DropDownButton()
        {
            InitializeComponent();

            this.RefreshButtonsRects();
            m_buttonBrush = new SolidBrush(this.ForeColor);
            m_buttonStringFormat = new StringFormat();
            m_buttonStringFormat.Alignment = StringAlignment.Center;
            m_buttonStringFormat.LineAlignment = StringAlignment.Center;
            
            // initialisation menu pour le bouton "combo"
            m_comboMenu = new ContextMenu();
            m_comboMenu.MenuItems.Add(new MenuItem("Ouvrir"));
            m_comboMenu.MenuItems.Add(new MenuItem("Ouvrir avec..."));

            this.SizeChanged += new EventHandler(DropDownButton_SizeChanged);
            this.ForeColorChanged += new EventHandler(DropDownButton_ForeColorChanged);
            this.MouseUp += new MouseEventHandler(DropDownButton_MouseUp);
        }

        /// <summary>
        /// Nettoyage des ressources utilisées.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if( components != null )
                    components.Dispose();
            }
            base.Dispose( disposing );
        }

        #region Code généré par le Concepteur de composants
        /// <summary>
        /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas 
        /// le contenu de cette méthode avec l'éditeur de code.
        /// </summary>
        private void InitializeComponent()
        {

        }
        #endregion

        private const int COMBOBUTTON_WIDTH = 20;   // largeur du bouton combo
        private Rectangle m_buttonRect;
        private Rectangle m_comboButtonRect;
        private SolidBrush m_buttonBrush;
        private StringFormat m_buttonStringFormat;
        private ContextMenu m_comboMenu;

        protected override void OnPaint(PaintEventArgs pe)
        {
            // dessin du bouton
            ControlPaint.DrawButton(pe.Graphics, m_buttonRect, ButtonState.Normal);
            // dessin du texte du bouton
            pe.Graphics.DrawString(this.Text, this.Font, m_buttonBrush, m_buttonRect, m_buttonStringFormat);
            // dessin du bouton "combo"
            ControlPaint.DrawComboButton(pe.Graphics, m_comboButtonRect, ButtonState.Normal);

            base.OnPaint(pe);
        }

        private void DropDownButton_SizeChanged(object sender, EventArgs e)
        {
            this.RefreshButtonsRects();
            this.Invalidate();
        }

        // se charge de calculer les coordonnées et dimensions du menu
        private void RefreshButtonsRects()
        {
            m_buttonRect = new Rectangle(
                new Point(0,0), 
                new Size(this.Width - COMBOBUTTON_WIDTH, this.Height)
                );
            m_comboButtonRect = new Rectangle(
                new Point(this.Width - COMBOBUTTON_WIDTH, 0),
                new Size(COMBOBUTTON_WIDTH, this.Height)
                );
        }

        // permet de recrée la brosse pour le texte du bouton
        private void DropDownButton_ForeColorChanged(object sender, EventArgs e)
        {
            this.m_buttonBrush = new SolidBrush(this.ForeColor);
        }

        // gestion de la souris
        private void DropDownButton_MouseUp(object sender, MouseEventArgs e)
        {
            Point clickedPoint = new Point(e.X, e.Y);
            
            // detection de l'element cliqué
            if ( m_comboButtonRect.Contains(clickedPoint) )
                OnComboButtonClicked(); // combo
            else
                OnButtonClicked();  // bouton normal
        }

        private void OnButtonClicked()
        {
            // TODO : faire quelquechose de mieux ici
            MessageBox.Show("Bouton");
        }

        private void OnComboButtonClicked()
        {
            // affichage du menu
            Point contextMenuPoint = new Point(
                m_comboButtonRect.X,
                m_comboButtonRect.Height
                );
            m_comboMenu.Show(this, contextMenuPoint);
        }
    }
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.