在winforms应用程序上绘制相反(反向)颜色

时间:2011-12-14 18:41:30

标签: c# winforms colors drawing

我们有一个winforms应用程序(Framework v4),它在屏幕上显示一个图像(通过PictureBox),并允许选择该图像上的矩形区域。在图像选择期间和之后,我们显示所选区域的边界。目前通过DrawRectangle电话完成此操作。

问题是如何选择这个矩形的颜色。无论选择何种颜色,它总是可以融入背景(图像)。 Microsoft绘制通过在“选择矩形”上动态反转颜色来处理这一点。这非常适合我们的应用程序,但我不知道如何在winforms中执行此操作。

我也环顾四周,看看是否有一种可以使用两种颜色的破折号样式(这样我可以指定黑白作为这些颜色,无论背景颜色是什么都可以看到),但是我找不到这种东西。

提前感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:1)

你提到另一种解决方案是画一条黑色和白色两种颜色的虚线,这样它就可以在任何背景上看到。

通过用一种颜色(例如黑色)绘制实线来伪造,然后用另一种颜色(例如白色)画一条虚线。

来自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);
}