2013-11-28 137 views
0

我需要允许用户通过位图绘制线条。线路应交互绘制,我的意思是使用典型的代码给用户关于什么是绘制的视觉反馈的东西进行:在位图上交互绘制线条

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

但这不是一个不统一的背景。

无效由点定义的矩形:起源,PreviousEnd然后使用Update()使得呈现相当混乱。我想知道如何执行此任务,这些都是可能的方法,我正在考虑:

  1. 在透明位图上画线,然后在位图框上绘制位图。我认为,对于大型图像来说,由于表演的原因,这是不可行的。
  2. 使用Picture.BackgroundImage的位图,然后绘制Picture.Image,但我无法弄清楚这是如何真的可以在当天保存
  3. 使用双缓冲?怎么样?
  4. 在pictureBox上叠加一个不同的控件(面板?),使其透明(可能吗?),然后绘制它。

可能有人给的最好的方向提示吗?我真的迷了路。

+0

我强烈建议WPF为此。 winforms是一种非常老的技术,没有人在意,而且由于缺乏硬件加速,它不支持丰富,快速的交互式用户界面。由于其基于DirectX的硬件加速底层引擎,WPF可以更好地处理基于图形的用户界面。 –

+0

感谢您的提示,但我正在编辑现有的程序,所以我无法更改我正在使用的技术。 – Daniel

+0

对于“交互式”行使用[ControlPaint.DrawReversibleLine()](http://msdn.microsoft.com/en-us/library/system.windows.forms.controlpaint.drawreversibleline(v = vs.110).aspx) 。如果你画同一条线两次,它会恢复原来的那个。堆叠控制在大多数情况下不起作用。对不起,“透明度”在WinForms中是一个误用。 –

回答

0

为我工作的解决方案已经在以下几点:

  1. 创建一个透明的面板;
  2. 把它放在它们完全重叠的位图上;
  3. 使用适当的鼠标事件在面板上绘制;
  4. 当然,没有必要取消以前的形状:这是一个误导性的问题。从以前绘制的暂时形状中区分用于绘制事件的正确列表中记录的永久形状,这将不会在下一次绘制事件中再次绘制出来;
  5. 确保使用PaintEventArgs提供的图形在Paint事件中执行所有绘图。感谢@HansPassant在另一篇文章中强调了这一点。