Почему нельзя нарисовать прямоугольник противоположным образом? - PullRequest
0 голосов
/ 03 июля 2018

Итак, я пытаюсь воссоздать Snipping Tool, который поставляется с Windows. Однако мне удалось заставить его нарисовать прямоугольник из верхнего левого угла, а затем, когда я переместил курсор в правый нижний угол.

Однако, если я попытаюсь переместить мой курсор от, скажем, середины экрана к верхнему левому углу, он не будет рисовать прямоугольник. Почему это? Вот GIF, показывающий, что происходит

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();
            }
        }

1 Ответ

0 голосов
/ 03 июля 2018

Итак, в итоге получается прямоугольник с отрицательной шириной и высотой.

Возможно, вы захотите использовать Math.Abs, чтобы убедиться, что вы получите правильную ширину и высоту в тех случаях, когда разница станет отрицательной.

При этом вы, вероятно, захотите рисовать из разных позиций в зависимости от того, где находится ваш курсор относительно выбранной точки. Что-то вроде

            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
...