2012-10-21 87 views
0

我嘗試編寫一個簡單的圖形編輯器。我有下一個問題,當我使用SolidBrush()繪製一些曲線時,我得到了被打斷的曲線(外觀圖像)。我需要獲得不間斷的曲線。我嘗試使用鼠標捕捉,但它不起作用(結果相同)。我如何解決它?請看下面的代碼爲MouseMove事件處理程序:簡單的鼠標移動處理

void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (isMouseDown) 
      { 
       pictureBox1.Capture = true; // I try to capture mouse here 
       Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle); 
       g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1); 
      } 
     } 

enter image description here

回答

0

這取決於你的鼠標移動的速度,有時MouseMove事件會更頻繁地觸發,有時不會。我認爲這也取決於你的機器在這個特定的系統中加載了多少。如果你在兩點之間畫線,它們不會彎曲,而是筆直。相反,你應該看看BeziersSplines。這樣你就可以基於幾點得到曲線。

但是你可以用你的代碼做些什麼。每當最後一次mousedown和當前mousedown事件之間的距離大於一個閾值(您可以憑經驗獲得),可以在曲線上添加新的點。下面 是被加入一個點的例子的代碼:

public bool isMouseDown { get; set; } 
     Point lastPoint = Point.Empty; 
     public double treshold { get; set; } 
     private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (isMouseDown) 
      { 
       pictureBox1.Capture = true; // I try to capture mouse here 
       Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle); 
       if (Math.Sqrt(Math.Pow(e.X - lastPoint.X, 2) + Math.Pow(e.Y - lastPoint.Y, 2)) > treshold) 
       { 
        g.FillRectangle(new SolidBrush(Color.Black), (e.X + lastPoint.X)/2, (e.Y + lastPoint.Y)/2, 1, 1); 

       } 

       g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1); 
       lastPoint = new Point(e.X, e.Y); 
      } 
     } 

     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      isMouseDown = true; 
      lastPoint = new Point(e.X, e.Y); 
     } 

     private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
     { 
      isMouseDown = false; 
     } 
+0

我知道我可以使用Bezier等多項式算法來做到這一點,但我不能說明這一點嗎?這不可能嗎? – abilash

+0

@Vsevywniy根據我的經驗,你不能影響多少鼠標移動事件將被提出的速度。也沒有最小的距離,將觸發mousemove。因此你會得到中斷曲線。 –

+0

當我在標準窗口中繪畫使用鉛筆工具繪製圖形編輯器時,我獲得了不間斷的曲線。這是否意味着它使用Bezier等多項式算法形成? – abilash

0

不要畫點,相反,還記得你上次鼠標的位置,並從中行到當前鼠標的位置。

+0

我不能以任何方式解決它繪圖點? – abilash

+0

不,因爲鼠標移動不是逐個像素。 –

0

GDI +問題,並特別是涉及到簡單的任務,例如圖中,鼠標操作和正確的事件驅動的測序可以在此文章中找到。

與大多數僅有代碼的示例不同,本文詳細解釋了爲什麼以及如何。

http://bobpowell.net/simpledraw.aspx

0

除了鼠標的移動問題,你在這裏有另一個更嚴重的問題。

使用圖形g = Graphics.FromHwnd(this.pictureBox1.Handle)並直接在圖形表面上繪圖將是臨時性的,因爲像素將消失。

鮑勃鮑威爾對此也有很好的回答。

查看他的#1最常問的GDI +問題。 http://bobpowell.net/picturebox.htm