简单的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);
}
}
简单的DropDownButton(Winform)的更多相关文章
- 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一
简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页 和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...
- WCF简单实例--用Winform启动和引用
以订票为例简单应用wcf程序,需要的朋友可以参考下 本篇转自百度文档,自己试过,确实可以用. 以订票为例简单应用wcf 新建一个wcf服务应用程序 在IService1.cs定义服务契约 namesp ...
- Task(TPL)简单的实现Winform(WPF)异步
很多时候,我们要实现Winform异步操作,你可以用传统的方法,但个人感觉代码不好理解,而且使用真有点不舒服.也可以用Task来实现,Task(.net4.0新添加的对象)其实就是对线程池线程的一个封 ...
- 简单的c#winform象棋游戏(附带源码)
算法源自网络(网络源码连接:http://www.mycodes.net/161/6659.htm) 整体思路:用二维数组构建棋盘每一个数组元素封装为一个picturebox附带若干属性(例如:棋 ...
- C# 简单反射实现winform左侧树形导航,右侧切换内容
先看看效果: 核心代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syst ...
- winform 与 html 交互 简单案例
本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...
- 简单的winform编辑器
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- C# 简单实现直线方程,抛物线方程
本例子是简单的在WinForm程序中实现在坐标系中绘制直线方程,抛物线方程,点.重新学习解析几何方面的知识.仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: 直线方程的表达方式:一般表达式Ax ...
- 封装简单的API——微信小程序
前几天自己琢磨微信小程序的基本开发,里边用到的技术包括WebAPI,也就是方法的封装. 当然也可以用ASP.NET MVC WCF来写接口.更简单应该就是 WinForm 简单易部署. 这里用的是 2 ...
随机推荐
- [Amazon] Amazon IAP for Unity
1> 下载amazon IAP3.0 for unity plugin 2> 根据 https://developer.amazon.com/public/apis/earn/in-app ...
- jQuery.hasClass() 函数
hasClass() 函数 判断当前选择元素是否有指定的类名 语法 $(selector).hasclass(classname) 返回值 返回值为布尔型(true/false) 如果当前选择对象包含 ...
- Vue 性能优化track-by
Vue 是一个MVVM框架 所谓mvvm就是model-->view,view-->model. vue帮助我们实现了自动绑定.省点我们用JQUERY,zpeto 去操作dom的麻烦. 主 ...
- 2017 New Year’s Greetings from Sun Yat-sen University
As winter turns to spring, the world around us begins to take on an air of freshness. As 2017 is fa ...
- 【A Global Line Matching Algorithm for 2D Laser Scan Matching in Regular Environment】
只看了前面的部分,灭有看实验,觉得整体风格比较傻白甜,与我的想法不谋而合.简单明了,用起来应该比较方便. 初步探测:如果有直线,就给线性插值一下. 分级聚类:利用简单的阈值给聚类了一下,分成了段段. ...
- Lander-Waterman model
参考: Lander-Waterman Model 这个模型是鸟枪法测序和基因组装的最基本的理论模型,它揭示了测序深度与覆盖度之间的关系. 该模型回答了一个最基本的问题:How many reads ...
- WORD 粘贴代码 不检查语法
- ajax中使用post传值数组array
如果我们在data中想放入array的参数,根据在网上搜索的结果有如下方法,但是没有一个成功的……我还是贴出来,别人成功了,也许是我哪里不对,日后也许还有机会研究..在文章的最后贴出了转化为json的 ...
- python 基本语法
第一个python程序 打开Sublime Text -->输出 print"Hello World" -->保存为frist.py -->打开命令行运行,运行p ...
- C++ void*的使用
void*类型可以存储任何类型的指针,使用的时候强制转化成对应类型的指针便可. #include <iostream> #include <vector> using name ...