прорисовка UserControl
От: Аноним  
Дата: 06.04.05 08:54
Оценка:
Добрый день.
У меня есть класс ThumbView — наследник UserControl
свойство AutoScroll = true
Он должен рисовать 100 прямоугольников.
Я перехватываю OnPaint.
При скролинге я вижу куски прямоугольников....
Что здесь не так???

Заранее спасибо.

        private void ThumbView_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {                
            int curY = 10 + this.AutoScrollPosition.Y;
            Pen p = new Pen(Color.Green, 4);  
            for (int i = 0; i < 100; i++)
            {
                e.Graphics.DrawRectangle(p, 10, curY, 80, 60);
                curY += 65;
            }            
            p.Dispose(); 
        }
Re: прорисовка UserControl
От: sv_light  
Дата: 06.04.05 16:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>У меня есть класс ThumbView — наследник UserControl
А>свойство AutoScroll = true
А>Он должен рисовать 100 прямоугольников.
А>Я перехватываю OnPaint.
А>При скролинге я вижу куски прямоугольников....
А>Что здесь не так???

Следует установить зависимость от автоскрола и для координаты X... должно быть вот так:
А>
А>        private void ThumbView_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
А>        {                
А>            int curY = 10 + this.AutoScrollPosition.Y;
            int curX = 10 + this.AutoScrollPosition.X;
А>            Pen p = new Pen(Color.Green, 4);  
А>            for (int i = 0; i < 100; i++)
А>            {
А>                e.Graphics.DrawRectangle(p, curX, curY, 80, 60);
А>                curY += 65;
А>            }            
А>            p.Dispose(); 
А>        }

А>
прорвемся!!
прорисовка UserControl
От: Аноним  
Дата: 06.04.05 10:21
Оценка:
У вас в коде ошибка в использовании this.AutoScrollPosition.
Вот:
private void tumbView_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {
   int curY = 10 + (sender as ScrollableControl).AutoScrollPosition.Y;
   Pen p = new Pen(Color.Green, 4);  
   for (int i = 0; i < 100; i++)
   {
    e.Graphics.DrawRectangle(p, 10, curY, 80, 60);
    curY += 65;
   }            
   p.Dispose(); 
  }


В принципе это правильней делать в самом UserControl контроле :
Например так:
public class TumbView : UserControl
 {
  public TumbView()
  { 
   this.SetStyle(ControlStyles.AllPaintingInWmPaint| ControlStyles.UserPaint|ControlStyles.DoubleBuffer,true);
   this.AutoScroll = true;
   this.AutoScrollMinSize = new Size(90,(65)*100+15);
  }
  protected override void OnPaint(PaintEventArgs e)
  {   
   base.OnPaint(e);
   int curY = 10 + this.AutoScrollPosition.Y;
   Pen p = new Pen(Color.Green, 4);  
   for (int i = 0; i < 100; i++)
   {
    e.Graphics.DrawRectangle(p, 10, curY, 80, 60);
    curY += 65;
   }            
   p.Dispose(); 
  }
 }

Ну и последнее. Вы слишком много рисуете, конечно, код который выходит за границы области рисования не нарисует сам DC (Graphics). Но можно сделать проверку самому (рисовать только в invalidate области) — и увеличить производительность.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.