Добрый день.
У меня есть класс 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();
}
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>У меня есть класс 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();
А> }
А>
У вас в коде ошибка в использовании
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
ссылка на оригинальное сообщение