Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2009, 16:18   #1
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию Рисование без мерцания

много уже было сказанно по этому поводу, в частности:
Цитата:
...вот я и удивляюсь - почему я получаю мерцание, если я вызываю 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".
но, может я чего не понимаю в этой жизни, но собственно, как ИСПОЛЬЗОВАТЬ эти приемы на практике?
(какие модули подключать и что конкретно писать в коде программы)

я рисую след.образом: предварительно рисую все в бмп, который потом кидаю на канву методом Canvas.Draw(0,0,bmpMap);
очищаю канву для перерисовки просто рисую большой четырехугольник с белой заливкой на области, до этого "разукрашенной"
Bayazet вне форума Ответить с цитированием
Старый 07.04.2009, 16:48   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

попробуйте использовать св-во DoubleBuffered:=true;
того объекта на котором вы рисуете
SERG1980 вне форума Ответить с цитированием
Старый 07.04.2009, 17:02   #3
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

хм.. у TPaintBox нет такого свойства, да и у TImage тоже нет.
Bayazet вне форума Ответить с цитированием
Старый 07.04.2009, 17:06   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Все вы верно делаите. Зачищать канву не надо это лишнее, вы ведь не рисуите с альфа каналом
Тему надо бы закрыть.
BOBAH13 вне форума Ответить с цитированием
Старый 07.04.2009, 17:13   #5
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

я именно так и рисую, методом draw
но мерцает
Bayazet вне форума Ответить с цитированием
Старый 07.04.2009, 17:18   #6
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию

аааааааа!! как же я лажанул!
действительно, если вручную не очищать канву, ничего не мерцает. лол.
тему закрыть)
Bayazet вне форума Ответить с цитированием
Старый 10.04.2009, 17:58   #7
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Читаем - http://www.programmersforum.ru/showthread.php?t=45082 Там и о мерцании тоже.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 10.04.2009, 21:29   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

На всякий случай...

Цитата:
Иногда при мерцании формы или отдельных компонентов достаточно сделать так:

Код:
Procedure TForm1.FormCreate(Sender: TObject);
Begin
Form1.DoubleBuffered:=True;
End;
Также не нужно очищать (даже частично) TImage.Canvas - лучше рисовать на временном "холсте" TBitmap, и уже затем целиком выводить на TImage.
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 10.04.2009, 22:19   #9
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

Я пользуюсь кодом, который приводил Kostia.
Создаю буфер
Код:
Buf: TBitmap;
Прежде чем выводить его на форму, очищаю его:
Код:
Buf.Canvas.FillRect(Rect(0,0,Buf.Width, Buf.Height);
Потом рисую на нём объекты, типа
Код:
Buf.Canvas.Draw(x,y,bmp);
И уже в конце вывожу на экран.
Код:
Canvas.Draw(0,0,Buf);
Манжосов Денис :) вне форума Ответить с цитированием
Старый 10.04.2009, 23:25   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
Прежде чем выводить его на форму, очищаю его:
Лучше не очищать , а обновлять фоном ( обычно при рисовании всегда есть какой то фон на котором рисуют)
Код:
Buf.Canvas.Draw(0,0,Fon);
, а потом уже на фон накладывать рисунок.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избавиться от мерцания при передвижении Timages. jocry Помощь студентам 13 22.07.2012 09:46
Рисование Granus Общие вопросы Delphi 2 24.12.2008 07:44
Процедуры без Bios и без Dos,бывают? codeok Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 31.10.2008 03:17
Рисование... HunterMan Win Api 10 30.04.2008 23:46
Рисование фигур в Delphi7 без использования VCL saintninja Помощь студентам 15 20.10.2007 11:04