Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-39080
Suntechnic
2004-01-23 18:34
2004.02.13
Мастера побеждают!


1-38840
tria
2004-02-02 17:02
2004.02.13
TAction в форме-потомке.


6-38992
_san_
2003-12-10 18:29
2004.02.13
Проблема с TclientSocket


14-39094
Mox Fulder
2004-01-22 21:30
2004.02.13
FreePascal


1-38809
Max_Ivanych
2004-02-03 11:09
2004.02.13
Проблема с Excel. Открываю и закрываю так:





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский