【发布时间】:2013-12-14 15:56:33
【问题描述】:
我需要允许用户在位图上画线。线条应该以交互方式绘制,我的意思是使用典型代码执行的操作,为用户提供关于所绘制内容的视觉反馈:
private void MainPictureBox_MouseDown( object sender, MouseEventArgs e)
{
DrawingInProgress = true ;
Origin = new Point (e.X, e.Y);
}
private void MainPictureBox_MouseUp(object sender, MouseEventArgs e)
{
DrawingInProgress = false ;
}
private void MainPictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (!DrawingInProgress) return ;
End = new Point (e.X, e.Y);
using( Pen OverlayPen = new Pen( Color .Red, 1.0f))
using (Graphics g = MainPictureBox.CreateGraphics())
{
g.DrawLine(OverlayPen, Origin, End);
}
}
当然,我在 MainPictureBox_MouseUp 中使用 List.Add 来跟踪点,以便在 Paint 事件中绘制线条(为简单起见,代码未显示)
如果没有背景图像,只需用背景颜色覆盖前一行,就可以很好地完成,例如:
g.DrawLine(BackgroundColorPen, Origin, PreviousEnd);
g.DrawLine(OverlayPen, Origin, End);
但这在不统一的背景下是不可能的。
使由点定义的矩形无效:Origin、PreviousEnd 然后使用 Update() 会使渲染变得非常混乱。我想知道如何执行此任务,我正在考虑这些可能的方法:
- 在透明位图上绘制线条,然后在图片框上绘制位图。我想对于大图像,出于性能原因,这根本不可行。
- 使用 Picture.BackgroundImage 作为位图,然后在 Picture.Image 上绘图,但我无法弄清楚这如何真正节省时间
- 使用双缓冲?怎么样?
- 在图片框上堆叠不同的控件(面板?),使其透明(可能吗?)然后在其上绘制。
有人能给出最佳方向的提示吗?我真的迷路了。
【问题讨论】:
-
为此我强烈推荐 WPF。 winforms 是一项非常古老的技术,没有人再关心了,由于缺乏硬件加速,它不支持丰富、快速、交互式的 UI。由于 WPF 基于 DirectX 的硬件加速底层引擎,因此 WPF 可以更好地处理基于图形的 UI。
-
感谢您的提示,但我正在编辑现有程序,因此无法更改我正在使用的技术。
-
对于“交互式”行使用ControlPaint.DrawReversibleLine()。如果您两次绘制同一条线,它将恢复原来的位置。堆叠控件在大多数情况下根本不起作用。抱歉,“透明度”在 WinForms 中是用词不当。