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

C# 在winforms应用程序上使用相反(反向)颜色绘制,c#,winforms,colors,drawing,C#,Winforms,Colors,Drawing,我们有一个winforms应用程序(框架v4),它在屏幕上显示一个图像(通过PictureBox),并允许在该图像上选择一个矩形区域。在图像选择期间和之后,我们显示所选区域的边界。这目前是通过DrawRectangle调用完成的 问题是如何选择这个矩形的颜色。无论选择何种颜色,都有可能混合到背景(图像)中。Microsoft paint通过在“选择矩形”上动态反转颜色来很好地处理此问题。这非常适合我们的应用程序,但我不知道如何在winforms中实现 我还环顾四周,看看是否有一种破折号样式可以使

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

问题是如何选择这个矩形的颜色。无论选择何种颜色,都有可能混合到背景(图像)中。Microsoft paint通过在“选择矩形”上动态反转颜色来很好地处理此问题。这非常适合我们的应用程序,但我不知道如何在winforms中实现

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


提前感谢您的帮助。

您可以使用
ControlPaint
方法绘制可逆矩形/框架

ControlPaint.FillReversibleRectangle

ControlPaint.DrawReversibleFrame

下面是一个小的伪代码方法示例

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

您提到的另一种解决方案是用两种颜色(黑色和白色)绘制一条虚线,以便它在任何背景上都可见

通过在一种颜色(例如黑色)中绘制实线,然后在另一种颜色(例如白色)中绘制虚线来假装这一点

想法和代码来自:


您将完全按照Microsoft Paint所做的操作,查看背景图像,并确定应该使用的颜色。请注意,有些颜色的相对颜色是th emself。我会在开源项目Paint.NET中寻找想法。这与WinForms无关,真正的解决方案是扩展您自己的能力,默认方法不会达到您想要的效果。@Ramhound:嗯,解决方案需要在WinForms中实现,所以解决方案必须与之相关。即使我查看背景图像,我也不确定如何将这些信息与winforms绘图函数中的API一起使用。我还查看了Paint.Net的许可证。它不允许创建衍生作品,因此我不确定查看其源代码并“获得灵感”是否是一个好主意。附言:谢谢你给我的关于颜色本身有对立的提示。我在考虑一个解决方案的时候会考虑这个问题。谢谢,我不知道<代码> DrutReVabyFrase。我可以画出矩形,但它消失了。我正在用
PictureBox
Paint
方法作画。这是错误的吗?请尝试在鼠标移动事件中调用DrawReversibleRectangle方法(在鼠标按下时存储开始,等等)
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);
}