2011-11-29 58 views
0

我在這裏的問題是一個2分的。在Panel-Panel裏面繪製圖片框#

我有一個位於面板內的圖片框。當我打開圖片時,圖片框的大小將調整爲圖片的大小,而面板的大小保持不變。該面板只有滾動條來查看整個圖像。

有兩件事情會出錯。

  1. 當我調整PictureBox的,由於某種原因,我只能畫在圖片框的前面部分。防爆。圖像框默認開始爲200x200。我打開一個500x400的圖像。而且我仍然只能畫出圖像的200x200部分。

  2. 我遇到的第二個問題是,當我在畫箱的選擇部分繪畫時,當我滾動到畫面不在視線的位置,然後回來時,我畫的圖像就消失了。我知道我需要某種picturebox.invalidate()。我只是不知道如何使用它。

這裏是我的代碼,以便更好地理解我在做什麼。

public Form1() 
    { 
     InitializeComponent(); 

     DrawArea = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height); 
     pictureBox1.Image = DrawArea; 

     objGraphics = this.pictureBox1.CreateGraphics(); 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
      drawImage(e); 
    } 

    public void drawImage(MouseEventArgs e) 
    { 
     Rectangle rDraw = new Rectangle(); 

     if (e.Button == MouseButtons.Left) 
     { 
      rDraw.X = e.X; 
      rDraw.Y = e.Y; 
      rDraw.Width = 3; 
      rDraw.Height = 3; 
      objGraphics.DrawEllipse(System.Drawing.Pens.Black, rDraw); 
     } 
    } 

    private void openToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      OpenFileDialog open = new OpenFileDialog(); 
      open.Filter = "Image Files(*.jpg; *.bmp)|*.jpg; *.bmp"; 
      if (open.ShowDialog() == DialogResult.OK) 
      { 
       Bitmap bit = new Bitmap(open.FileName); 

       pictureBox1.Size = bit.Size; 
       DrawArea = bit; 
       pictureBox1.Image = bit; 
      } 
     } 
     catch (Exception) 
     { 
      throw new ApplicationException("Failed loading image"); 
     } 
    } 

非常感謝!

回答

0

您需要在圖片框的Paint事件中繪製。

你應該(幾乎)從不使用CreateGraphics()

+0

我到底該怎麼做。我有繪畫事件,但我不確定如何使用事件精確繪製。 – Johnrad

+0

在e.Graphics上繪製。繪畫事件可以被多次觸發(例如,如果您滾動)。爲了強制它重繪,'無效()'它。 – SLaks

+0

對不起,太天真了。我會重載繪畫事件正確?從我的mouse_move事件傳遞它? – Johnrad