2013-06-25 24 views
0

我真的很難用C#繪圖,而且我使用的是Windows Forms而不是WPF,所以也許我從一開始就做錯了......你告訴我......但我想在PictureBox上(在MouseDown上)放置一個臨時標記,它將跟隨鼠標(刪除之前的自身圖形,即不留下蹤跡),然後被繪製在MouseUp事件的最後位置。在PictureBox中,在鼠標上畫一個臨時圓圈,跟隨鼠標,直到檢測到mouseUp事件爲止

下面是一些框架代碼,你們可以填寫:

bool mDown; 
Graphics g; // initialized to pictureBox1.CreateGraphics() on Form_Load, though 
       // I am unsure how that differs from Graphics.FromImage(pictureBox1) 
SolidBrush sbGray, sbGreen; 


private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    mDown = true; 
    // store/push initial drawing 
    g.FillEllipse(sbGray, e.X - 5, e.Y - 5, 10, 10); 
} 


private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (mDown) 
    { 
     // restore/pop initial drawing, erasing old trail 
     g.FillEllipse(sbGray, e.X - 5, e.Y - 5, 10, 10); 
    } 
} 


private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
{ 
    // restore/pop initial drawing, erasing old trail 
    g.FillEllipse(sbGreen, e.X - 5, e.Y - 5, 10, 10); 
    mDown = false; 
} 

我想有幾個方法對皮膚一隻貓,如改變鼠標的圖標,所以也許這甚至不是以最好的方式做它?即使如此,我也許需要知道這兩個問題的答案 - 是否有更好的方法來做到這一點,以及如何從PictureBox中提取圖形(因爲這些知識很可能稍後會有用)。

(注:雖然灰色圓圈應該抹去自己,綠色圓圈應該是持久的,多個綠色圓圈應該能夠在同一時間在PictureBox中現有的。)

+0

有* *諸多問題,使用的createGraphics(),你沒有見過他們。當然,請改用pictureBox1.Cursor屬性,就是這樣。 –

回答

1

你需要看看PictureBox's Paint事件另外,最好在Paint事件中完成所有的圖形處理,因爲你不必擔心處理圖形對象。看看這是你想要的。

編輯:添加代碼以保留點並清除它們。

public partial class Form1 : Form 
{ 
    bool mDown; 
    SolidBrush sbGray = new SolidBrush(Color.Gray); 
    SolidBrush sbGreen = new SolidBrush(Color.LimeGreen); 
    SolidBrush sbTemp; 
    Point mPosition = new Point(); 

    public List<Point> points = new List<Point>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.Image = Image.FromFile(@"C:\Temp\Test.jpg"); 
    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 

     if (e.Button == MouseButtons.Left) 
     { 
      mDown = true; 
      mPosition = new Point(e.X, e.Y); 
      sbTemp = sbGray; 
      pictureBox1.Invalidate(); 
     } 
     else 
     { 
      points.Clear(); 
      sbTemp = null; 
      pictureBox1.Invalidate(); 
     } 


    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (mDown) 
     { 
      mPosition = new Point(e.X, e.Y); 
      sbTemp = sbGray; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      mPosition = new Point(e.X, e.Y); 
      points.Add(mPosition); 
      sbTemp = sbGreen; 
      pictureBox1.Invalidate(); 
      mDown = false; 
     } 

    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     if (sbTemp != null) 
     { 
      e.Graphics.FillEllipse(sbTemp, mPosition.X -5, mPosition.Y -5, 10, 10); 
     } 
     if (points != null) 
     { 
      foreach (var loc in points) 
      { 
       e.Graphics.FillEllipse(sbGreen, loc.X - 5, loc.Y - 5, 10, 10); 
      } 
     } 
    } 
} 
+0

你好......這個效果很好,但不幸的是,以前的MouseUp的舊點不會停留在周圍。這種將嬰兒拋出洗澡水。我想保留舊的圈子,同時擦除蹤跡。我原來的想法基本上是在OP中解釋的(除了「綠色」圓圈的持久性),但也許另一種方法是清除圖形並從頭開始重新繪製所有的圓圈?我不知道哪個更快... =/ – TimFoolery

+0

@TFFoleolery只需將您的點數存儲在列表中,那麼每次PictureBox失效時都可以重新繪製它們。看我的編輯。 –

相關問題