简单的DropDownButton(Winform)

 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);
        }
    }

  

时间: 2024-11-07 20:04:10

简单的DropDownButton(Winform)的相关文章

简单的验证码Winform程序

之前想过写验证的的小程序,一直没写,现在手头项目结项,根据自己的思路快的写了个小的WinForm的验证码程序.代码简单没有多大难度. frmVerification.cs前台 winform项目中的frmVerification.cs后台代骊 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Li

简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一

分页非为前端分页  和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是后端分页 这里先要说明WinForm分页和Web分页都会存在一个问题:查两次(一次取得页面总数,一次取得当前页数据) 所以分页是需要数据特别大的时候才具有优化的意义,比如查询100条数据是1ms 查询1000条数据是1.1s如果使用分页,那么查询的耗时基本上就是2ms(算上嵌套查询的话是3ms),so自行掂量 控件网上有很多不多说了 说下sql(EF的略过) ----

简单的c#winform象棋游戏

算法源自网络(网络源码连接:http://www.mycodes.net/161/6659.htm)   整体思路:用二维数组构建棋盘每一个数组元素封装为一个picturebox附带若干属性(例如:棋子归属方.棋子的类型),用一个抽象基类规定基本的棋子移动规则(例如:不能选中空白picturebox.该红方走棋时不能选中蓝方棋子),具体的棋子单独从基类棋子类派生 重写派生类的方法规定其走棋规则,和相应填充picturebox的图片(例如: 炮不能斜着走不能直线吃子,翻山炮必须吃子且移动路径上只能

简单的winform编辑器

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Data.SqlClient;using System.IO;

winform 与 html 交互 简单案例

本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html,需要一个webBrowser控件. 2.新建一个html页面,这里命名为“test.htm”. 3.c#代码: //为了使网页能够与winform交互 将com的可访问性设置为真 [System.Security.Permissions.PermissionSet(System.Security.

封装简单的API——微信小程序

前几天自己琢磨微信小程序的基本开发,里边用到的技术包括WebAPI,也就是方法的封装. 当然也可以用ASP.NET MVC WCF来写接口.更简单应该就是 WinForm 简单易部署. 这里用的是 2017版本的 Core 2.0 WebAPI [Route("api/select")] //定义路由 public class SelectController:Controller { /// <summary> /// 查询所有信息 /// </summary>

使用.net core3.0 正式版创建Winform程序

前阵子一直期待.net core3.0正式版本的出来,以为这个版本出来,Winform程序又迎来一次新生了,不过9.23日出来的马上下载更新VS,创建新的.net core Winform项目,发现并没有Winform窗体设计器.而微软目前则是通过插件的方式,让我们单独下载Winform设计器,这个设计器还是预览版本,很多功能还是没有实现的,只能算是一个简单的雏形,本博客案例介绍基于.net core3.0创建一个普通的WInform程序,让大家了解下基于.net core3.0创建的程序的大概

C# winform用sharpGL(OpenGl)解析读取3D模型obj

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11783026.html 自己写了个简单的类读取解析obj模型,使用导入类,然后new个对象,在读取obj模型,然后调用显示列表显示就可以了.至于其他什么旋转移动的你们自己加起来应该很容易的,因为我有看过c#下别人写的obj模型解析的代码项目,加了很多东西,我都找不到自己要用的代码在哪里,而我只需要读取解析obj模型这块代码而已,气的我自己写了个类自己解析,所以我怕我代码写多了, 你们反而看起

使用cefsharp在winform中嵌套浏览器,解决程序闪退问题,你也可以做一个红芯浏览器^v^

使用cefsharp在winform中嵌套浏览器 简单使用cefsharp在winform中嵌套浏览器 在上一节,我们学习了如何简单地在winform中嵌入chromium浏览器,我在使用这个开发项目时,需要点击一个按钮,弹出嵌入浏览器的窗体,出现一个问题,就是第一次点击按钮可以正常打开浏览器,第二次点击就会出现卡壳,闪退问题.由于对于chromium这个庞大的程序不太了解,上网搜索相关文章解决了该问题: 就是在嵌入浏览器的窗体类中不能用Cef.shutdown();需要在调用的主窗体中才能调用