using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace AppLauncher.Windows.Forms { public class AForm : Form { protected readonly Color borderColour = Color.FromArgb(232, 231, 236); protected readonly int borderWidth = 1; protected readonly Color titleBarColour = Color.FromArgb(237, 240, 247); protected readonly int titleBarHeight = 56; private bool isDragging = false; private Point startPosition = new Point(); public AForm() : base() { if (!this.DesignMode) { this.FormBorderStyle = FormBorderStyle.None; this.StartPosition = FormStartPosition.Manual; } } protected override void OnMouseClick(MouseEventArgs e) { base.OnMouseClick(e); bool isLabel = ((e.Location.X >= 0) && (e.Location.X <= this.Width) && (e.Location.Y >= 0) && (e.Location.Y <= titleBarHeight)); if (e.Button == MouseButtons.Left) { if (isLabel) { // do nothing } else { // do nothing } } else if (e.Button == MouseButtons.Right) { if (isLabel) { if (this.TitleContextMenuStrip != null) { this.TitleContextMenuStrip.Show(this, e.Location); } } else { // do nothing } } } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button != MouseButtons.Left) { return; } isDragging = true; startPosition = e.Location; } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (isDragging) { int x = (this.Location.X + (e.Location.X - startPosition.X)); int y = (this.Location.Y + (e.Location.Y - startPosition.Y)); //this.Location = validateFormLocation(x, y); this.Location = new Point(x, y); } } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); isDragging = false; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; Rectangle area = new Rectangle(this.DisplayRectangle.X, this.DisplayRectangle.Y, (this.DisplayRectangle.Width - borderWidth), (this.DisplayRectangle.Height - borderWidth)); // border g.DrawRectangle(new Pen(borderColour, borderWidth), area); area.Inflate((-1 * borderWidth), (-1 * borderWidth)); g.FillRectangle(new SolidBrush(titleBarColour), area.X, area.Y, (area.Width + area.X), titleBarHeight); g.DrawLine(new Pen(borderColour, 1), area.X, (titleBarHeight + 1), (area.Width + area.X), (titleBarHeight + 1)); g.DrawImageUnscaled(Properties.Resources.app_icon_24, 17, 17); TextRenderer.DrawText(g, "Launcher", new Font(this.Font.FontFamily, 14F), new Point(58, 17), Color.FromArgb(156, 158, 171)); } protected override void OnResize(EventArgs e) { base.OnResize(e); this.Invalidate(); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public override Color BackColor { get => base.BackColor; set => base.BackColor = Color.FromArgb(254, 254, 254); } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; } [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new Padding Padding { get => base.Padding; set => base.Padding = new Padding(0); } [Category("Appearance")] public ContextMenuStrip TitleContextMenuStrip { get; set; } = null; protected Point DefaultLocation { get { Point newPosition = new Point(Cursor.Position.X, Cursor.Position.Y); newPosition.X -= (this.Width / 2); newPosition.Y -= (this.Height / 2); newPosition.X = Math.Max(newPosition.X, Screen.PrimaryScreen.WorkingArea.Left); newPosition.Y = Math.Max(newPosition.Y, Screen.PrimaryScreen.WorkingArea.Top); return newPosition; } } } }