2013-02-20 3 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

Или просто как нарисовать прямоугольник на коробке с картинками, даже когда панель перекрашена? –

ответ

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

Спасибо, миллионы профессионалов. Если вы не показываете мне этот путь, я не знаю, как это сделать. –

1

вы также можете использовать pictureBoxView.Refresh()

и определить два локальных переменные сохранить свиток смещения через ScrollEventArgs.NewValue

, если вы не хотите, чтобы рисовать при прокрутке, вы можете использовать этот

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

+0

Спасибо за помощь. Это хорошо, так же, как и решение yBee. Надеюсь, у тебя хороший день. –

Смежные вопросы