[С#]артефакты при прокрутке

olegusmaximus

есть 2 обработчика собития Paint
оба в объекте Graphics рисуют таблицу чисел
но с разным фоном
есть полоса прокрутки
на событие Scroll стоит обработчик который вызывает Invalidated
так вот
меняется обработчик для Paint
и когда начинаешь прокручивать таблицу
она какогото прорисовывается по несколько раз
причом видно что и старый обработчик то же работает(видно что фон другой появляется)
так то конечно все нормально
только ета рябь напрягает
если кто чо понял
то жду советов

anzakaznov

никто ничего не понял
но, может быть, double buffer тебе поможет?

olegusmaximus

может быть
но как ето включить знаю только для OGL

anzakaznov

у формы есть свойство DoubleBuffered
или что-то в этом духе
читай по нему хелпу: там надо ещё какие-то свойства в тру выставлять

olegusmaximus

а почему может не работать?

anzakaznov

плохо прочитал хелпу?
не ту хелпу?
не хелпу?
не тем?

olegusmaximus

public void EnableDoubleBuffering
{
// Set the value of the double-buffering style bits to true.
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint,
true);
this.UpdateStyles;
}

anzakaznov

ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint
а так можно ваще?

olegusmaximus

а чо тебя смущает?
ето из мсдна

anzakaznov

я просто не знал, что так мона

anzakaznov

а почему может не работать?

о
вспомнил
то же самое надо прописать и во всех юзер- и кастом-контролах

olegusmaximus

так метод SetStyle
ето ж протектед метод
так что для всех не получится

anzakaznov

повторяю
юзер- и кастом-контролах

то есть на твоих

olegusmaximus

свой только один
ето главная форма
вообще то даблбуфер для объекта Graphics работать будет?

anzakaznov

ты что сказал, сам-то понял?
нет, конечно

olegusmaximus

ето потому что
не пойму как оно работает

anzakaznov

Graphics не наследуется от Control
причём тут SetStyle?

olegusmaximus

ну так для него как то можно
сделать double buffer?
или как еще можно рисовать и выводить данные?

anzakaznov

ещё раз
даббл-буффер ставится на кастом-контрол или форму или ещё что-либо, наследующееся от контрола
то есть объект графикс -- вообще говоря -- не знает, даббл-буферённый у него пэрент или нет
короче
давай свою прогу -- попробую посмотреть, в чём траблы

olegusmaximus

смотри при прокрутке мерцает
синее - Graphics

anzakaznov

ок
вечером гляну

anzakaznov

йоптваю!
нафиг мне твой экзешник, а?
сорцы давай!
так я вижу только то, что даббл-буфферизация не работает
всё

olegusmaximus

так дабл буфер вообще для graphics можно включить?
(расширил \\otec)

Dasar

1. Вынеси отрисовку в отдельный UserControl и уже ему поставь DoubleBuffer
2. Font-ы, Brush-ы и Pen-ы лучше создавай однократно, а не при каждой перерисовке, так как создание этих объектов - довольно длительная операция
3.
this.res_wnd.Paint += new System.Windows.Forms.PaintEventHandler(this.res_draw_anal);
предыдущий обработчик почему не отключаешь?
у тебя же оба будут вызываться.

olegusmaximus

как отключит пред обраб?
и еще насчет п.1 то есть?

Dasar

> как отключит пред обраб?
Через -= можно.
ps
но в данном случае, имхо, лучше вообще от событий отказаться, т.к. события больше заточены под статическую привязку.
> и еще насчет п.1 то есть?
Делаешь Add new user control
уже именно в этом user control-е делаешь отрисовку (вывод графика или что там у тебя а этот user control вставляешь на главную форму.

anzakaznov

по поводу 1
принципиальный момент: картинку фигачиьт надо прямо на сам контрол, а не на какую-нить там панельку, в этом контроле расположенную

olegusmaximus

просто так лучше смотриться

anzakaznov

дело в том, что у меня были проблемы с распространением даббл-буфферизации на суб-контролы
избегал их описанным выше способом
ну или через кастом-контролы

Dasar

> просто так лучше смотриться
дык, UserControl клади на панель, а вот наоборот не стоит.
Оставить комментарий
Имя или ник:
Комментарий: