2013-11-28 179 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在另一篇文章中強調了這一點。