Simple screen area picker for WinForms apps.
// this is the calling form
// will hide/show automatically
MouseForm.Show(this, region => {
// work with Rectangle region...
});
using System; | |
using System.Drawing; | |
using System.Windows.Forms; | |
namespace Common | |
{ | |
public class MouseForm : Form | |
{ | |
bool down; | |
Point start; | |
Rectangle region; | |
readonly Pen pen; | |
Action<Rectangle> callback; | |
public MouseForm() | |
{ | |
Opacity = 0.25; | |
TopMost = true; | |
Cursor = Cursors.Cross; | |
this.BackColor = Color.White; | |
Bounds = Screen.PrimaryScreen.Bounds; | |
FormBorderStyle = FormBorderStyle.None; | |
WindowState = FormWindowState.Maximized; | |
StartPosition = FormStartPosition.Manual; | |
region = Rectangle.Empty; | |
pen = new Pen(Color.Red, 2); | |
Shown += MouseForm_Shown; | |
FormClosed += MouseForm_FormClosed; | |
MouseDown += MouseForm_MouseDown; | |
MouseMove += MouseForm_MouseMove; | |
MouseUp += MouseForm_MouseUp; | |
Paint += MouseForm_Paint; | |
} | |
void MouseForm_Shown(object sender, EventArgs e) | |
{ | |
Owner.Hide(); | |
} | |
void MouseForm_FormClosed(object sender, FormClosedEventArgs e) | |
{ | |
Owner.Show(); | |
} | |
void MouseForm_MouseDown(object sender, MouseEventArgs e) | |
{ | |
down = true; | |
start = e.Location; | |
} | |
void MouseForm_MouseMove(object sender, MouseEventArgs e) | |
{ | |
if (!down) | |
return; | |
region.X = Math.Min(e.X, start.X); | |
region.Y = Math.Min(e.Y, start.Y); | |
region.Width = Math.Abs(e.X - start.X); | |
region.Height = Math.Abs(e.Y - start.Y); | |
Refresh(); | |
} | |
void MouseForm_MouseUp(object sender, MouseEventArgs e) | |
{ | |
down = false; | |
callback(region); | |
Close(); | |
} | |
void MouseForm_Paint(object sender, PaintEventArgs e) | |
{ | |
e.Graphics.DrawRectangle(pen, region); | |
} | |
public static void Show(Form owner, Action<Rectangle> callback) | |
{ | |
var form = new MouseForm(); | |
form.callback = callback; | |
form.Show(owner); | |
} | |
} | |
} |