2013-04-16 69 views
1

我期待在MouseMove()事件期間在屏幕上繪製一個橢圓,但我希望它只繪製從起點到當前鼠標位置的最近橢圓。目前它正在爲每個正在註冊的鼠標位置繪製一個橢圓。如果我簡單地使用MouseDown()和MouseUp()事件,我將能夠很容易地繪製它,而不顯示橢圓,但我希望用戶能夠在它們移動鼠標時看到橢圓,以便它們可以確切地知道他們在哪裏放置它。有誰知道我怎麼能做到這一點?如何用最近的鼠標位置重繪一個橢圓

我當前的代碼如下:

private void pnlDraw_MouseDown(object sender, MouseEventArgs e) 
{ 
    initialX = e.X; 
    initialY = e.Y; 
    previousX = e.X; 
    previousY = e.Y; 
    isPainting = true; 
} 

private void pnlDraw_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (isPainting) 
    { 
     switch (currentDrawType) 
     { 

      case DRAWTYPE.ELLIPSE: 
      { 
       DrawEllipse(e); 
       break; 
      } 
      default: 
      { 
       break; 
      } 
     } 
    } 
} 

private void DrawEllipse(MouseEventArgs e) 
{ 
    pen = new Pen(Color.Black); 
    Graphics graphics = pnlDraw.CreateGraphics(); 
    graphics.DrawEllipse(pen, initialX, initialY, e.X - initialX, e.Y - initialY); 

    previousX = e.X; 
    previousY = e.Y; 
    graphics.Dispose(); 
} 

任何幫助將不勝感激!

+0

你是說在每次調用MouseMove時繪製橢圓,但是不會在下一次調用時擦除它? – LightStriker

+0

是的,這就是它! – si2zle

回答

1

在屏幕上繪製東西時,應該做的第一件事是清除以前顯示的內容。否則,您只需繪製現有繪圖的頂部。

在WinForm中,它通常在OnBackgroundPaint()方法中處理,這是一種簡單的說法,它應該清除背景。

它不應該是這樣的:

e.Graphics.FillRectangle(new SolidBrush(MyBackgroundColor), e.ClipRectangle); 

,或者如果它不是一個繪圖事件:

graphics.FillRectangle(new SolidBrush(MyBackgroundColor), 0, 0, MyWidth, MyHeight); 

而且應該畫在它上面的任何之前調用。 這也是一個擔保,您的繪圖區已準備就緒。

+0

好的,我需要保存到目前爲止的每個繪製點,然後在每個事件上重新繪製這些點。然後我可以簡單地刪除我不想繪製的保存點? – si2zle

+0

這樣做,或者您可以將之前的繪圖保存爲重繪爲背景的位圖。每個新圖形都添加到位圖中。這取決於您是否希望用戶以獨立實體或單個畫布的形式訪問每個項目。 – LightStriker

+0

謝謝堆!!!!! – si2zle