using System; using System.Drawing; using System.Windows.Forms; namespace EveOPreview.View.Implementation { public partial class RegionPickerDialog : Form { private Point _startPoint; private Point _endPoint; private bool _isDrawing; private Rectangle _selectedRegion; public Rectangle SelectedRegion => _selectedRegion; public RegionPickerDialog() { InitializeComponent(); InitializeDialog(); } private void InitializeDialog() { // Make the form cover all screens Rectangle totalBounds = GetTotalScreenBounds(); this.Bounds = totalBounds; this.StartPosition = FormStartPosition.Manual; this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized; this.TopMost = true; this.ShowInTaskbar = false; this.Cursor = Cursors.Cross; // Make the form semi-transparent but not fully transparent this.BackColor = Color.Black; this.Opacity = 0.3; // Add event handlers this.MouseDown += RegionPickerDialog_MouseDown; this.MouseMove += RegionPickerDialog_MouseMove; this.MouseUp += RegionPickerDialog_MouseUp; this.KeyDown += RegionPickerDialog_KeyDown; this.Paint += RegionPickerDialog_Paint; // Add instructions label var instructionsLabel = new Label { Text = "Click and drag to select a region. Press ESC to cancel.", ForeColor = Color.White, BackColor = Color.Black, Font = new Font("Arial", 12, FontStyle.Bold), AutoSize = true, Location = new Point(10, 10) }; this.Controls.Add(instructionsLabel); } private Rectangle GetTotalScreenBounds() { Rectangle bounds = Screen.PrimaryScreen.Bounds; foreach (Screen screen in Screen.AllScreens) { bounds = Rectangle.Union(bounds, screen.Bounds); } return bounds; } private void RegionPickerDialog_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { _startPoint = e.Location; _isDrawing = true; this.Capture = true; this.Invalidate(); } } private void RegionPickerDialog_MouseMove(object sender, MouseEventArgs e) { if (_isDrawing) { _endPoint = e.Location; this.Invalidate(); } } private void RegionPickerDialog_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && _isDrawing) { _isDrawing = false; _endPoint = e.Location; this.Capture = false; // Calculate the selected region int x = Math.Min(_startPoint.X, _endPoint.X); int y = Math.Min(_startPoint.Y, _endPoint.Y); int width = Math.Abs(_endPoint.X - _startPoint.X); int height = Math.Abs(_endPoint.Y - _startPoint.Y); if (width > 10 && height > 10) // Minimum size { _selectedRegion = new Rectangle(x, y, width, height); this.DialogResult = DialogResult.OK; this.Close(); } else { // Reset if region is too small _startPoint = Point.Empty; _endPoint = Point.Empty; this.Invalidate(); } } } private void RegionPickerDialog_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { this.DialogResult = DialogResult.Cancel; this.Close(); } } private void RegionPickerDialog_Paint(object sender, PaintEventArgs e) { if (_isDrawing) { // Draw selection rectangle using (Pen pen = new Pen(Color.Red, 2)) { pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; int x = Math.Min(_startPoint.X, _endPoint.X); int y = Math.Min(_startPoint.Y, _endPoint.Y); int width = Math.Abs(_endPoint.X - _startPoint.X); int height = Math.Abs(_endPoint.Y - _startPoint.Y); e.Graphics.DrawRectangle(pen, x, y, width, height); } // Draw size information if (_startPoint != Point.Empty && _endPoint != Point.Empty) { int width = Math.Abs(_endPoint.X - _startPoint.X); int height = Math.Abs(_endPoint.Y - _startPoint.Y); string sizeText = $"{width} x {height}"; using (Font font = new Font("Arial", 10, FontStyle.Bold)) using (Brush brush = new SolidBrush(Color.White)) { e.Graphics.DrawString(sizeText, font, brush, _endPoint.X + 5, _endPoint.Y + 5); } } } } } }