2011-02-02 55 views
1

我試圖在mousemove事件的圖片框周圍拖動一個形狀,但我努力讓它平穩地移動。圖片框中加載了一個圖像作爲背景,我希望圖形對象在單擊並拖動鼠標時在圖像頂部拖動一個圓。在位圖頂部拖動圖形對象

我通過每次鼠標移動並重新加載圖片框時創建原始圖像的克隆來工作,但它似乎是它們必須是實現此目的的更好方法。

每次添加任何圖形時,都不會重新加載原始位圖,從而創建更像繪畫應用程序的軌跡。

如何每次清除之前的圖紙而不重新加載整個圖像?任何幫助讚賞。

private void picCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_drag) 
    { 
     picCanvas.Image = (Bitmap)_original.Clone(); 
     Graphics g = Graphics.FromImage((Bitmap)picCanvas.Image); 
     g.DrawEllipse(_whitePen, e.X, e.Y, 10, 10); 
     picCanvas.Invalidate(); 
    } 
} 

private void picCanvas_MouseDown(object sender, MouseEventArgs e) 
{ 
    _drag = true; 
} 

private void picCanvas_MouseUp(object sender, MouseEventArgs e) 
{ 
    _drag = false; 
} 

回答

0

要以最佳方式解決問題,請使用picCanvas.Paint事件。 在mousemove事件中設置位置並使用該位置在繪畫事件中繪製。

Point pos = Point.Empty;// or your initial position 

    private void picCanvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (_drag) 
     { 
      pos = e.Location; 
     } 
    } 
    private void picCanvas_Paint(object sender, PaintEventArgs e) 
    { 
     if (_drag) 
     { 
      Graphics g = e.Graphics;//The event handler sends us the graphics object to use for painting 
      g.DrawEllipse(_whitePen, pos.X, pos.Y, 10, 10); 
     } 
    } 

您應該將Paint事件添加到控件並將圖像設置爲formload或某些初始化函數。

picCanvas.Image = (Bitmap)_original.Clone(); 
+0

感謝。我需要做一個小小的改變,因爲繪畫事件似乎沒有收到真正的「_drag」值,所以永遠不會繪製,但你足夠接近我。 – fluent 2011-02-02 10:53:10

0

使用Honibis的上述答案,我結束了這一點。

負荷的圖像和無效的圖片引起刷新

picCanvas.Image = image; 
picCanvas.Invalidate() 

然後在漆事件

private void picCanvas_Paint(object sender, PaintEventArgs e) 
{ 
    if (_drag)   
    { 
    using (Pen pen = new Pen(Color.White, 2)) 
    { 
     e.Graphics.DrawEllipse(pen, pos.X, pos.Y, 10, 10); 
    } 
    } 
} 
3

檢查這個樣本是簡單

//Load Image 
Bitmap TestImage = new Bitmap(FileName); 
//Create Graphics Object 
Graphics g = Graphics.FromImage(TestImage);     
g.DrawEllipse(new Pen(Color.Red), i, j,0.5F, 0.5F); 
//View Your Results 
pictureBox1.Image = TestImage;