码迷,mamicode.com
首页 > Windows程序 > 详细

简单的DropDownButton(Winform)

时间:2016-06-17 17:05:00      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

 public class DropDownButton : System.Windows.Forms.Control
    {
        private System.ComponentModel.Container components = null;

        private bool isHover = false;
        private bool isPressLeft = false;
        private bool isPressRight = false;


        public event EventHandler ClickEvent;

        public Menu.MenuItemCollection MenuItems { get; set; }

        public string Caption { get; set; }

        public DropDownButton()
        {
            InitializeComponent();

            this.RefreshButtonsRects();

            m_comboMenu = new ContextMenu();
            MenuItems = new Menu.MenuItemCollection(m_comboMenu);

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


        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                    components.Dispose();
            }
            base.Dispose(disposing);
        }

        protected override void OnMouseHover(EventArgs e)
        {
            this.isHover = true;
            this.Invalidate();
            base.OnMouseHover(e);
        }
        
        protected override void OnMouseLeave(EventArgs e)
        {
            this.isHover = false;
            this.Invalidate();
            base.OnMouseLeave(e);
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (m_buttonRect.Contains(e.Location))
                {
                    isPressLeft = true;
                }
                if (m_comboButtonRect.Contains(e.Location))
                {
                    isPressRight = true;
                }
                this.Invalidate();
            }
            base.OnMouseDown(e);
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                isPressLeft = false;
                isPressRight = false;
                this.Invalidate();
            }
            base.OnMouseUp(e);
        }
        private void InitializeComponent()
        {

        }

        private const int COMBOBUTTON_WIDTH = 20;
        private Rectangle m_buttonRect;
        private Rectangle m_comboButtonRect;
        private ContextMenu m_comboMenu;

        protected override void OnPaint(PaintEventArgs pe)
        {
            System.Windows.Forms.VisualStyles.PushButtonState stateL = System.Windows.Forms.VisualStyles.PushButtonState.Normal;
            System.Windows.Forms.VisualStyles.PushButtonState stateR = System.Windows.Forms.VisualStyles.PushButtonState.Normal;

            if (isHover)
            {
                stateL = System.Windows.Forms.VisualStyles.PushButtonState.Hot;
                stateR = System.Windows.Forms.VisualStyles.PushButtonState.Hot;
            }

            if (isPressLeft)
            {
                stateL = System.Windows.Forms.VisualStyles.PushButtonState.Pressed;
            }

            if (isPressRight)
            {
                stateR = System.Windows.Forms.VisualStyles.PushButtonState.Pressed;
            }

            this.CreateGraphics().DrawRectangle(new Pen(SystemBrushes.Control), this.ClientRectangle);


            ButtonRenderer.DrawButton(this.CreateGraphics(),
                m_buttonRect, Caption,
                new Font(this.Font, FontStyle.Regular), false,
                stateL);

            ButtonRenderer.DrawButton(this.CreateGraphics(),
                m_comboButtonRect, "v",
                new Font(this.Font, FontStyle.Regular), false,
                stateR);

            base.OnPaint(pe);
        }

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

        private void RefreshButtonsRects()
        {
            m_buttonRect = new Rectangle(
                new Point(0, 0),
                new Size(this.Width - COMBOBUTTON_WIDTH + 2, this.Height)
                );
            m_comboButtonRect = new Rectangle(
                new Point(this.Width - COMBOBUTTON_WIDTH, 0),
                new Size(COMBOBUTTON_WIDTH, this.Height)
                );
        }


        private void DropDownButton_MouseUp(object sender, MouseEventArgs e)
        {
            Point clickedPoint = new Point(e.X, e.Y);

            if (m_comboButtonRect.Contains(clickedPoint))
            {
                OnComboButtonClicked();
            }
            else
            {
                OnButtonClicked(e);
            }
        }

        private void OnButtonClicked(MouseEventArgs e)
        {
            if (this.ClickEvent != null)
            {
                ClickEvent(this, e);
            }
        }

        private void OnComboButtonClicked()
        {
            Point contextMenuPoint = new Point(m_comboButtonRect.Y, m_comboButtonRect.Height);
            //m_comboMenu.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
            m_comboMenu.Show(this, contextMenuPoint);
        }
    }

  

简单的DropDownButton(Winform)

标签:

原文地址:http://www.cnblogs.com/systemview/p/5594282.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!