Рисующий прямоугольник исчезает после маркировки области обрезки - PullRequest
0 голосов
/ 08 апреля 2020

Цель:

Нарисуйте прямоугольник красного цвета и при отпускании левой кнопки мыши. Держите прямоугольник.

Код:

private void button1_Click(object sender, EventArgs e)
{
    if (Clipboard.ContainsImage())
    {
        pictureBox1.Image?.Dispose();
        pictureBox1.Image = Clipboard.GetImage();
    }
    else
    {
        MessageBox.Show("No Image detected in clipboard." + Environment.NewLine + "Have you print screened the label?", "Print Screen", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        LocationXY = e.Location;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        LocationX1Y1 = e.Location;
        pictureBox1.Invalidate();
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        LocationX1Y1 = e.Location;

        pictureBox1.Invalidate();
        pictureBox2.Invalidate();
    }
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (MouseButtons == MouseButtons.Left)
    {
        e.Graphics.DrawRectangle(Pens.Red, GetRect());
    }
}

private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
    var src = GetRect();

    if (src == Rectangle.Empty) return;

    var des = new Rectangle(0, 0, src.Width, src.Height);

    e.Graphics.DrawImage(pictureBox1.Image,
        des, src, GraphicsUnit.Pixel);
}


private Rectangle GetRect()
{
    return new Rectangle(
        Math.Min(LocationXY.X, LocationX1Y1.X),
        Math.Min(LocationXY.Y, LocationX1Y1.Y),
        Math.Abs(LocationXY.X - LocationX1Y1.X),
        Math.Abs(LocationXY.Y - LocationX1Y1.Y)
        );
}

private Bitmap GetCroppedImage()
{
    var des = GetRect();

    if (des == Rectangle.Empty) return null;

    var b = new Bitmap(des.Width, des.Height);

    using (var g = Graphics.FromImage(b))
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, des.Width, des.Height), des, GraphicsUnit.Pixel);
    }
    return b;
}

Результат:

При нажатии этой кнопки печатается изображение на экране отображается:

[! [введите описание изображения здесь] [1]] [1]

Если я щелкну левой кнопкой мыши и перетащу его, появится красный прямоугольник:

[! [Введите описание изображения здесь] [2]] [2]

Как только я его отпущу:

[! [Введите описание изображения здесь] [1]] [ 1]

Вопрос:

Как пометить область, которую я хочу обрезать, и сохранить там красный прямоугольник? Без исчезновения

1 Ответ

3 голосов
/ 08 апреля 2020

Поскольку вы рисуете красный прямоугольник только при нажатии левой кнопки мыши,

не рисуется при последующих вызовах pictureBox1_Paint после отпускания левой кнопки мыши.

Со следующим небольшим изменением мы можем нарисовать красный прямоугольник и сделать его постоянным:

// Draw the red rectangle not only when
// the left mouse button is pressed
// but only when GetRect() is not empty
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Rectangle currentSelection = GetRect();
    if (currentSelection != Rectangle.Empty)
    {
        e.Graphics.DrawRectangle(Pens.Red, currentSelection);
    }
}

Примечание: pictureBox2_Paint завершается неудачей, если pictureBox1.Image имеет значение null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...