C# 在位图上以交互方式绘制线条

C# 在位图上以交互方式绘制线条,c#,winforms,C#,Winforms,我需要允许用户在位图上画线。线条应该以交互方式绘制,我指的是使用典型代码执行的一些操作,为用户提供有关绘制内容的视觉反馈: private void MainPictureBox_MouseDown( object sender, MouseEventArgs e) { DrawingInProgress = true ; Origin = new Point (e.X, e.Y); } private void Main

我需要允许用户在位图上画线。线条应该以交互方式绘制,我指的是使用典型代码执行的一些操作,为用户提供有关绘制内容的视觉反馈:

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);      
     }
}
当然,我使用List.Add在main picturebox_MouseUp中跟踪点,以便在绘制事件中绘制线条(为了简单起见,未显示代码)

如果没有背景图像,只需用背景色覆盖前一行即可完成,例如:

 g.DrawLine(BackgroundColorPen, Origin, PreviousEnd);     
 g.DrawLine(OverlayPen, Origin, End);     
但在背景不一致的情况下,这是不可能的

使由points:Origin,PreviousEnd定义的矩形无效,然后使用Update()会使渲染非常混乱。我想知道如何执行这项任务,我正在考虑以下可能的方法:

  • 在透明位图上绘制线条,然后在Picturebox上绘制位图。我想对于大图像来说,这是不可行的
  • 使用Picture.BackgroundImage作为位图,然后在Picture.Image上绘图,但我无法理解这是如何度过这一天的
  • 使用双缓冲?怎么做
  • 将不同的控件(面板?)堆叠在pictureBox上,使其透明(可能吗?),然后在其上绘制

  • 有人能给我一个最好的提示吗?我真的迷路了。

    我的解决方案如下:

  • 创建一个透明的面板
  • 将其放置在位图上,使其完全重叠
  • 使用适当的鼠标事件在面板上绘制
  • 当然,没有必要取消之前的形状:这是一个误导性的问题。将输入到绘制事件的适当列表中记录的永久形状与之前绘制的在下一个绘制事件中将不再绘制的瞬态形状区分开来就足够了
  • 绝对确保使用PaintEventArgs提供的图形在绘制事件中执行所有图形。感谢@HansPassant在另一篇帖子中强调了这一点

  • 为此,我强烈推荐WPF。winforms是一项非常古老的技术,没有人再关心它了,由于缺乏硬件加速,它不支持丰富、快速、交互式的UI。WPF支持更好地处理基于图形的UI,因为它是基于DirectX的硬件加速底层引擎。感谢您的提示,但我正在编辑现有程序,因此无法更改我使用的技术。对于“交互式”行,请使用。如果你画两次同一条线,它将恢复原来的状态。堆叠控件在大多数情况下根本不起作用。对不起,“透明”在WinForms中用词不当。