Mark Denom
Mark Denom

Reputation: 1057

Why can't it draw a rectangle the opposite way?

So I am trying to recreate the Snipping Tool that comes with Windows. However I've manage to get it to draw a rectangle from the top left corner and then when I move my cursor to the bottom right.

However if I try to move my cursor from let's say the middle of the screen to the top left it doesnt draw the rectangle. Why is this? Here is a GIF showing what happends

https://i.imgur.com/0Y7xXnS.gifv

//These variables control the mouse position
        int selectX;
        int selectY;
        int selectWidth;
        int selectHeight;
        public Pen selectPen;

        //This variable control when you start the right click
        bool start;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Hide the Form
            this.Hide();

            //Create the Bitmap (This is an a black bitmap holding just the size.) (Bitmap is mutable)
            Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                Screen.PrimaryScreen.Bounds.Height);

            //Create a graphics object that's ready for alteration. `printscreen` is now a graphics Object
            Graphics graphics = Graphics.FromImage(printscreen);

            //Alter the graphics object which again is the printscreen
            graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);

            //Create a temporary memory stream for the image
            using (MemoryStream s = new MemoryStream())
            {
                //save graphic variable into memory
                printscreen.Save(s, ImageFormat.Bmp);

                //Set the size of the picturebox
                pictureBox1.Size = new Size(Width, Height);

                //set the value of the picturebox.Image to an Image.FromStream and load the temp stream
                pictureBox1.Image = Image.FromStream(s);
            }
            //Show Form
            this.Show();

            //Cross Cursor
            Cursor = Cursors.Cross;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                selectX = e.X;
                selectY = e.Y;
                selectPen = new Pen(Color.DimGray, 1);
                selectPen.DashStyle = DashStyle.Solid;
                pictureBox1.Refresh();
                start = true;
            }
        }


        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (start)
            {
                selectWidth = e.X - selectX;
                selectHeight = e.Y - selectY;
                pictureBox1.Refresh();
                pictureBox1.CreateGraphics().DrawRectangle(selectPen,
                    selectX, selectY, selectWidth, selectHeight);
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Stream sound = Resources.SnapshotSound;
                SoundPlayer player = new SoundPlayer(sound);
                player.PlaySync();
                Application.Exit();
            }
        }

Upvotes: 0

Views: 139

Answers (1)

Classe
Classe

Reputation: 256

So what you end up with is basically a rectangle with a negative width and height.

You'll probably want to use the Math.Abs to make sure you get a proper width and height in the cases the difference would become negative.

With that, you will also probably want to draw from different positions based on where your cursor is in relation to the selected point. Something like

            selectWidth = e.X - selectX;
            selectHeight = e.Y - selectY;

            // If width is less than 0, draw from pointer, otherwise from select X
            var drawFromX = selectWidth < 0 ? e.X : selectX;

            // If height is less than 0, draw from pointer, otherwise from select Y
            var drawFromY = selectHeight < 0 ? e.Y : selectY;

            pictureBox1.Refresh();
            pictureBox1.CreateGraphics().DrawRectangle(selectPen,
                drawFromX, 
                drawFromY, 
                Math.Abs(selectWidth),  // Make sure the rectangle width is positive
                Math.Abs(selectHeight)); // Make sure the rectangle height is positive

Upvotes: 2

Related Questions