Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Внизвывод на form1.canvas Найти похожие ветки
← →
programania (2004-02-03 18:22) [0]Мне ответили на этом форуме Reindeer Moss Eater (30.01.04 12:50) [1],
что на form1.canvas можно выводить только в onPaint,
чтоб не пропадало. Неужели это правда?
Ведь вызов onPaint неуправляем, а выводить нужно
в любой момент и в любом месте программы.
Если в onPaint выводить каждый раз
весь form1.canvas, то заметно серое мигание.
Почему при выводе в Image1.canvas ничего не
пропадает и не мигает при перерисовке формы?
Похоже, что формы перерисовывает Windows, а не onPaint,
причем только ту часть что открывается и
делает это быстрее чем я могу в onPaint ведь
мне не известно что нужно перерисовывать а что нет.
Если это не Windows, то кто же красит в унылый серый цвет,
то что открывается? Может tForm?
Как ей дать знать, что происходит вывод
на form1.canvas, чтоб она сама все перерисовывала?
Может типа InvalidateRect с хитрыми параметрами
в нужном месте?
Если это невозможно так и скажите, я заткнусь
и буду тихо выводить в Image1.canvas или onPaint.
← →
Семен Сорокин (2004-02-03 18:33) [1]Неужели это правда?
Чистая правда и ничего кроме правды.
Если в onPaint выводить каждый раз
весь form1.canvas, то заметно серое мигание.
DoubleBuffered + F1
Почему при выводе в Image1.canvas ничего не
пропадает и не мигает при перерисовке формы?
а ты перетащи форму с Image за границы экрана (или измени размер), а потом верни
Если это не Windows, то кто же красит в унылый серый цвет,
то что открывается? Может tForm?
именно, его обработчик OnPaint по умолчанию
Как ей дать знать, что происходит вывод
на form1.canvas, чтоб она сама все перерисовывала?
Refresh, Repaint, Invalidate
← →
Clift (2004-02-03 18:38) [2]...вот я и удивляюсь - почему я получаю мерцание, если я вызываю Repaint или Refresh, а не метод OnPaint напрямую? Или это просто "вариация на тему"?
Имеются две фазы обновления окна. В первой фазе, при выводе окна, Windows посылает ему сообщение WM_ERASEBKGND, сообщающее о необходимости стирания фона перед процедурой рисования. Затем посылается сообщение WM_PAINT, служащее сигналом для закрашивания "переднего плана".
Тем не менее, вы можете пропустить первую фазу, которая вызывает мерцание, одним из двух способов: первый способ заключается в том, что вы форсируете обновление сами, с помощью вызова функции Windows API InvalidateRect. На входе он получает дескриптор окна, указатель на закрашиваемую область - передаем NIL, если вы хотите отрисовать всю область окна - и третий параметр, сообщающий о необходимости очистки фона. Вот как раз последний параметр и должен содержать значение FALSE, если вы сами будете в методе Paint полностью отрисовывать всю область:
InvalidateRect( Handle, NIL, FALSE ) ;
Handle должен быть дескриптором формы или элемента управления.
Описав первый способ, я скажу, что существует другое подходящее решение - использовать функциональность VCL. Вы можете указать VCL не стирать фон, добавляя [ csOpaque ] к значению свойства ControlStyle, как показано ниже:
ControlStyle := ControlStyle + [ csOpaque ] ;
Это ограничивает заполнение заднего фона, но вы все еще можете видеть процесс "наполнения" области изображением, т.е. процесс рисования. В этом случае вы можете отделаться от эффекта мельтешения, рисуя на TBitmap и выводя его затем на экран командой CopyRect.
Если вы хотите углубиться в тему дальше, то я отошлю вас к моей статье "Optimizing Display Updates in Delphi" (Оптимизация обновления экрана в Delphi), опубликованной в первом выпуске журнала "Delphi magazine".
Mike Scott.
Взято из ФАКа Валентина Озерова
http://delphi.hostmos.ru/download.php?docs&go=5
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c