2017-02-22 95 views
0

我正在使用pictureBox移動2個線性階段;當mouseDown事件觸發時,將重新映射pictureBox座標以匹配軸的最大行程長度,然後發送給它們以執行移動。更新pictureBox上的圓圈位置

爲改善此功能,我在此圖像上添加了一個小點以便在mouseDown事件期間跟蹤鼠標的當前位置。 每當鼠標移動時,點必須更新其位置;爲了做到這一點,我使用了gfx.Clear(Color.White);刪除前一個並繪製新的。 問題是要了解軸的正確定位,pictureBox應顯示軸的照片;但調用gfx.Clear(Color)會清除圖像並留下白色背景。

有沒有辦法來更新點位置,而不調用gfx.Clear(爲了保持形象?)

if (e.Button.Equals(MouseButtons.Left)) 
      { 
       { 
        this.gridImage.Refresh(); 
        convertedX = (e.X * 100)/gridImage.Size.Width; 
        convertedY = (e.Y * 100)/gridImage.Size.Height; 
        using (Graphics gfx = Graphics.FromImage(this.gridImage.Image)) 
        { 
         circle_bounds.X = e.X; 
         circle_bounds.Y = e.Y; 
         gfx.Clear(Color.White); 

         gfx.DrawEllipse(Pens.Red, this.circle_bounds); 


        } 
        Console.WriteLine("(X,Y): " + convertedX.ToString() + " " + convertedY.ToString()); 
        Thread.Sleep(20); 
        //moveAbs(port1, "1", convertedX.ToString()); 
        //moveAbs(port2, "1", convertedY.ToString()); 
        initialXText.Text = convertedX.ToString(); 
        initialYText.Text = convertedY.ToString(); 

       } 
      } 
+0

你應該畫圓到P盒的表面上。使用'使用(圖形gfx = gridImage.CreateGraphics)'爲此;拋出一個Refresh()!.結果不會持續,但那不是你想要的,對吧?對於持久性繪圖,使用Paint事件及其e.Graphics對象和gridImage.Invalidate來觸發Paint .. - 你確定在MouseMove中睡眠嗎?聽起來非常不穩!有關更新行示例,請參見[這裏](http://stackoverflow.com/questions/38414334/how-to-draw-an-updating-line/38419518?s=24|0.0642#38419518)! – TaW

+0

工作就像一個魅力!謝謝! –

+0

注意:'Graphics gfx = gridImage.CreateGraphics()'通常是一個嚴重的錯誤,因爲數據是__not persistent__,也就是說,在最小化形式之後。在這裏使用它是規則中罕見的__exception__! – TaW

回答

0

什麼,我會使用​​事件繪製點必須做按照鼠標移動。首先,我聲明瞭一個Point存儲鼠標位置移動時的任何時間:

Point mousePosition; 

然後,在PictureBox.MouseMove事件處理程序,我將存儲這個位置並失去PictureBox:最後

private void gridImage_MouseMove(object sender, MouseEventArgs e) 
{ 
    mousePosition = e.Location; 
    pictureBox1.Invalidate(); 
} 

,在​​我只是用鼠標畫一個圓圈位置:

private void gridImage_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawEllipse(Pens.Red, new Rectangle(mousePosition, new Size(5,5))); 
} 

希望這會導致你在正確的方向