Рисование противоположными (обратными) цветами в приложении winforms - PullRequest
4 голосов
/ 14 декабря 2011

У нас есть приложение winforms (Framework v4), которое показывает изображение (через PictureBox) на экране и позволяет выбрать прямоугольную область на этом изображении.Во время и после выбора изображения мы показываем границы выделенной области.В настоящее время это делается с помощью вызова DrawRectangle.

Проблема заключается в том, как выбрать цвет этого прямоугольника.Независимо от выбранного цвета, всегда возможно, что он будет сливаться с фоном (изображение).Microsoft Paint отлично справляется с этой задачей, динамически меняя цвета на «прямоугольнике выбора».Это очень хорошо подходит для нашего приложения, но я понятия не имею, как это сделать в winforms.

Я также посмотрел вокруг, чтобы увидеть, есть ли стиль тире, который позволит использовать два цвета (так что яможно указать черный и белый цвета в качестве этих цветов, делая их видимыми независимо от цвета фона), но я не смог найти ничего подобного.

Заранее благодарен за помощь.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Вы можете использовать ControlPaint методы для рисования обратимого прямоугольника / рамки

ControlPaint.FillReversibleRectangle MSDN

и

ControlPaint.DrawReversibleFrame MSDN

Вот небольшой пример метода псевдокода

private void DrawReversibleRectangle(int x, int y) {
  // Hide the previous rectangle by calling the methods with the same parameters.
  var rect = GetSelectionRectangle(this.PointToScreen(this.reversibleRectStartPoint), this.PointToScreen(this.reversibleRectEndPoint));
  ControlPaint.FillReversibleRectangle(rect, Color.Black);
  ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Dashed);
  this.reversibleRectEndPoint = new Point(x, y);
  // Draw the new rectangle by calling
  rect = GetSelectionRectangle(this.PointToScreen(this.reversibleRectStartPoint), this.PointToScreen(this.reversibleRectEndPoint));
  ControlPaint.FillReversibleRectangle(rect, Color.Black);
  ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Dashed);
}
1 голос
/ 28 октября 2016

Вы упоминаете, что альтернативным решением было бы нарисовать пунктирную линию в двух цветах, черном и белом, чтобы она была видна на любом фоне.

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

Идея и код от: http://csharphelper.com/blog/2012/09/draw-two-colored-dashed-lines-that-are-visible-on-any-background-in-c/

using (Pen pen1 = new Pen(Color.Black, 2))
{
    e.Graphics.DrawRectangle(pen1, rect);
}
using (Pen pen2 = new Pen(Color.White, 2))
{
    pen2.DashPattern = new float[] { 5, 5 };
    e.Graphics.DrawRectangle(pen2, rect);
}
...