2013-02-20 80 views
2

我正在使用C#開發一個簡單的工具,其中有一個面板內的圖片框。面板的屬性Autoscroll = true。如果該圖片框的圖像大於面板,則該面板具有滾動條滾動面板後恢復圖形

我可以在圖片框的繪畫事件上畫一個矩形。但是當我滾動,這個矩形消失。我知道在移動滾動條後需要重新繪製它,但我不知道如何重新恢復它。

x,y,width,heigth,zoom是全局變量,當使用點擊進入treenode時,它會有數據。

private void pictureBoxView_Paint(object sender, PaintEventArgs e) 
     { 
      if (choose == true) 
      { 
       Size newSize = new Size((int)(pictureBoxView.Image.Width * zoom), 
             (int)(pictureBoxView.Image.Height * zoom)); 
       Graphics graphic = pictureBoxView.CreateGraphics(); 
       Pen pen = new Pen(Color.Red, 3); 
       graphic.DrawRectangle(pen, x, y, width, height); 
       pen.Dispose(); 
      } 
     } 


private void treeViewTemplate_AfterSelect(object sender, TreeViewEventArgs e) 
     { 
      // refresh picturebox 
      pictureBoxView.Refresh(); 

      // allow repaint 
      choose = true; 

      string[] value = treeViewTemplate.SelectedNode.Tag.ToString().Split(','); 
      x = Int32.Parse(value[0]); 
      y = Int32.Parse(value[1]); 
      width = Int32.Parse(value[2]); 
      height = Int32.Parse(value[3]); 
      zoom = Double.Parse(value[4]); 

      //MessageBox.Show("x = " + y + ", y = " + y + ", width = " + width + ", height = " + height + ", zoom = " + zoom); 

      // This call draw a rectangle again when I choose a value from TreeNode's Tag 

      pictureBoxView_Paint(this, null); 
     } 
+0

或者乾脆就是如何在圖片框上繪製矩形,即使面板被重新繪製? – 2013-02-20 08:16:01

回答

0

通常應該使用Invalidate方法以重繪控制的表面:

pictureBoxView.Invalidate(); 

這裏是重繪PictureBox即內部的Panel的樣品:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    var rectangle = new Rectangle(10, 10, 100, 100); 
    e.Graphics.DrawRectangle(Pens.Red, rectangle); 
} 

private void panel1_Scroll(object sender, ScrollEventArgs e) 
{ 
    pictureBox1.Invalidate(); 
} 

面板滾動時,將重繪固定的紅色矩形。

+0

感謝數百萬贊成。如果你不以這種方式展示我,我不知道如何完成它。 – 2013-02-21 01:38:51

1

你也可以使用pictureBoxView.Refresh()

,並定義了兩個局部變量保存滾動ScrollEventArgs.NewValue

偏移,如果你不想滾動時畫畫,你可以使用這個

private void panel1_Paint(object sender, PaintEventArgs e) { pictureBox1.Refresh();}

+0

感謝您的幫助。這是一個好方法,與yBee的解決方案一樣。希望你有美好的一天。 – 2013-02-21 01:39:38