#region License Information (GPL v3) /* ShareX - A program that allows you to take screenshots and share any file type Copyright (c) 2007-2024 ShareX Team This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Optionally you can also view the license at . */ #endregion License Information (GPL v3) using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace ShareX.HelpersLib { public class MenuButton : Button { [DefaultValue(null)] public ContextMenuStrip Menu { get; set; } [DefaultValue(false)] public bool ShowMenuUnderCursor { get; set; } public void OpenMenu() { if (Menu != null) { OpenMenu(new Point(0, Height)); } } public void OpenMenu(Point menuPosition) { if (Menu != null) { Menu.Show(this, menuPosition); } } protected override void OnMouseDown(MouseEventArgs mevent) { base.OnMouseDown(mevent); if (Menu != null && mevent.Button == MouseButtons.Left) { if (ShowMenuUnderCursor) { OpenMenu(mevent.Location); } else { OpenMenu(); } } } protected override void OnPaint(PaintEventArgs pevent) { base.OnPaint(pevent); if (Menu != null) { int arrowX = ClientRectangle.Width - Padding.Right - 14; int arrowY = (ClientRectangle.Height / 2) - 1; Color color = Enabled ? ForeColor : SystemColors.ControlDark; using (Brush brush = new SolidBrush(color)) { Point[] arrows = new Point[] { new Point(arrowX, arrowY), new Point(arrowX + 7, arrowY), new Point(arrowX + 3, arrowY + 4) }; pevent.Graphics.FillPolygon(brush, arrows); } } } } }