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); } }
因篇幅问题不能全部显示,请点此查看更多更全内容