Hello,
I'm receiving an error message (ArgumentException was unhandled - Parameter is not valid) when I'm trying to capture a portion of the screen with a rectangle.
It works great when drawing the rectangle with clickPoint.X < lastPoint.X and clickPoint.Y < lastPoint.Y, but when lastPoint.X or/and lastPoint.Y is lower than clickPoint.X or/and clickPoint.Y it throws the exception mentioned above.
Here is the code:
public partial class captureForm : Form
{
public bool mouseBtnClicked;
public Point clickPoint = new Point();
public Point lastPoint = new Point();
public Bitmap areaCapture;
public captureForm()
{
InitializeComponent();
formPropreties();
backGround();
this.MouseDown += new MouseEventHandler(mouse_Click);
this.MouseUp += new MouseEventHandler(mouse_Up);
this.MouseMove += new MouseEventHandler(mouse_Move);
mouseBtnClicked = false;
}
public void formPropreties()
{
this.ControlBox = false;
this.Text = string.Empty;
this.ShowInTaskbar = false;
this.WindowState = FormWindowState.Maximized;
this.Cursor = Cursors.Cross;
this.DoubleBuffered = true;
}
public void backGround()
{
Size screenBounds = Screen.PrimaryScreen.Bounds.Size;
Bitmap capture = new Bitmap(screenBounds.Width, screenBounds.Height);
Graphics W = Graphics.FromImage(capture);
W.CopyFromScreen(Point.Empty, Point.Empty, screenBounds);
this.BackgroundImage = capture;
}
private void mouse_Click(object sender, MouseEventArgs e)
{
mouseBtnClicked = true;
clickPoint.X = e.X;
clickPoint.Y = e.Y;
lastPoint.X = -1;
lastPoint.Y = -1;
}
public void drawnRectangle(Point p1, Point p2)
{
Rectangle rc = new Rectangle();
p1 = PointToScreen(p1);
p2 = PointToScreen(p2);
if (p1.X < p2.X)
{
rc.X = p1.X;
rc.Width = p2.X - p1.X;
}
else
{
rc.X = p2.X;
rc.Width = p1.X - p2.X;
}
if (p1.Y < p2.Y)
{
rc.Y = p1.Y;
rc.Height = p2.Y - p1.Y;
}
else
{
rc.Y = p2.Y;
rc.Height = p1.Y - p2.Y;
}
ControlPaint.DrawReversibleFrame(rc, Color.Black, FrameStyle.Dashed);
}
public void mouse_Up(object sender, MouseEventArgs e)
{
mouseBtnClicked = false;
if (lastPoint.X != 1)
{
Point currentPoint = new Point(e.X, e.Y);
drawnRectangle(clickPoint, lastPoint);
}
Point StartPoint = new Point(clickPoint.X + 1, clickPoint.Y + 1);
Point hideBorder = new Point( - 1, - 1);
Rectangle rc = new Rectangle(clickPoint.X, clickPoint.Y, lastPoint.X - clickPoint.X, lastPoint.Y - clickPoint.Y);
areaCapture = new Bitmap(rc.Width, rc.Height);
using (Graphics c = Graphics.FromImage(areaCapture))
{
c.CopyFromScreen(StartPoint, hideBorder, rc.Size);
}
DialogResult = DialogResult.OK;
}
private void mouse_Move(object sender, MouseEventArgs e)
{
Point currentPoint = new Point(e.X, e.Y);
if (mouseBtnClicked)
{
if (lastPoint.X != -1)
{
drawnRectangle(clickPoint, lastPoint);
}
lastPoint = currentPoint;
drawnRectangle(clickPoint, currentPoint);
}
}
}
Thank you