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)的更多相关文章

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

    简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页  和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...

  2. WCF简单实例--用Winform启动和引用

    以订票为例简单应用wcf程序,需要的朋友可以参考下 本篇转自百度文档,自己试过,确实可以用. 以订票为例简单应用wcf 新建一个wcf服务应用程序 在IService1.cs定义服务契约 namesp ...

  3. Task(TPL)简单的实现Winform(WPF)异步

    很多时候,我们要实现Winform异步操作,你可以用传统的方法,但个人感觉代码不好理解,而且使用真有点不舒服.也可以用Task来实现,Task(.net4.0新添加的对象)其实就是对线程池线程的一个封 ...

  4. 简单的c#winform象棋游戏(附带源码)

    算法源自网络(网络源码连接:http://www.mycodes.net/161/6659.htm)   整体思路:用二维数组构建棋盘每一个数组元素封装为一个picturebox附带若干属性(例如:棋 ...

  5. C# 简单反射实现winform左侧树形导航,右侧切换内容

    先看看效果: 核心代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...

  6. winform 与 html 交互 简单案例

    本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...

  7. 简单的winform编辑器

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  8. C# 简单实现直线方程,抛物线方程

    本例子是简单的在WinForm程序中实现在坐标系中绘制直线方程,抛物线方程,点.重新学习解析几何方面的知识.仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: 直线方程的表达方式:一般表达式Ax ...

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

    前几天自己琢磨微信小程序的基本开发,里边用到的技术包括WebAPI,也就是方法的封装. 当然也可以用ASP.NET MVC WCF来写接口.更简单应该就是 WinForm 简单易部署. 这里用的是 2 ...

随机推荐

  1. Gbase数据库备份与还原

    备份命令:cd D:\GeneralData\GBase\Server\bin        回车 后 : d :        回车 后: dump.exe -usysdba(u+用户名) -pbj ...

  2. asp.net 获取汉字字符串的拼音首字母,含多音字

    需求:在很多时候数据查询的时候,我们希望输入某个人姓名的拼音首字母进行查询,例如“潘长江”,输入“pcj”,就能搜索潘长江相关信息. 实现: #region 获取汉字转换拼音 首字母 public s ...

  3. css3 transition动画

    CSS3: 一.transition: <property> <duration> <animation type> <delay> eg: .div{ ...

  4. mybatis动态切换数据源

    (#)背景:由于业务的需求,导致需要随时切换15个数据源,此时不能low逼的去写十几个mapper,所以想到了实现一个数据源的动态切换 首先要想重写多数据源,那么你应该理解数据源的一个概念是什么,Da ...

  5. js跨域_jsonP

    $.ajax("url", type:"get", dataType:"jsonp", jsonp:"callback" ...

  6. Python之路 day3 高阶函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...

  7. Android N做了啥

    Android N做了哪些改变 一.    性能改善 Doze超级省电模式 手机在关屏同时没有充电的情况,在一段时间后会进入打盹状态,第一阶段会停掉同步.作业.网络等访问,第二阶段会停掉app的位置服 ...

  8. windows下安装beautifulsoup4

    方法一: pip install beautifulsoup4 方法二: 在官网下载安装包后,放在python目录下--运行cmd--进入bs4安装包路径--输入setup.py install 测试 ...

  9. 用socket实现ping功能(记录)

    /* 参考 http://bbs.csdn.net/topics/230001156 原文为win32版本 稍有改动,以适应mac与linux系统 */ #include <stdio.h> ...

  10. caffe中关于数据进行预处理的方式

    caffe的数据层layer中再载入数据时,会先要对数据进行预处理.一般处理的方式有两种: 1. 使用均值处理 transform_param { mirror: true crop_size: me ...