2011-12-14 85 views
4

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

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

我还环顾了一下,看看是否有一种可以使用两种颜色的短划线样式(这样我就可以指定黑色和白色作为这些颜色,使其无论背景颜色如何都可见),但我找不到这种类型的东西。

在此先感谢您的帮助。

+1

你会做Microsoft画图究竟是干什么的,看一下背景图像,并确定你应该使用的颜色。请注意,有些颜色与自己的颜色相反。我会看看开源项目Paint.NET的想法。这与WinForms无关,真正的解决方案是扩展自己的能力,默认的方法不会达到你想要的。 – 2011-12-14 18:50:10

+0

@Rhhound:好的,解决方案需要在Winforms中实现,所以解决方案必须与它有关。即使我查看背景图片,我也不确定如何在winforms绘图函数中将这些信息与API一起使用。我也看了Paint.Net的许可证。它不允许创建派生作品,因此我不确定查看其源代码并“获得灵感”是否是一个好主意。 PS:感谢关于颜色的提示,它们有自己的对立面。我将在考虑解决方案时考虑这一点。 – alokoko 2011-12-14 19:07:57

回答

2

可以使用ControlPaint方法作画的可逆矩形/帧

ControlPaint.FillReversibleRectangleMSDN

ControlPaint.DrawReversibleFrameMSDN

这里是一个小的伪代码方法例如

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

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

用一种颜色(例如黑色)绘制实线,然后用另一种颜色(例如白色)绘制一条虚线。

理念和代码: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); 
}