Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мигание TCanvas [D5, Win95/98]


Soft(Unpowered Kiborg) ©   (2002-08-04 14:54:00) 

Здравствуйте.
Возникла проблемма. При перерисовке данных на компонете наследованную с TPaintBox через Canvas происходит эффект мигания. В досе это решалось через смену видео страниц:) А в виндовсе слышал, что можно как-то запретить обновления окна а потом разрешить, но не знаю как.


MJH   (2002-08-05 01:56:00) [1]

однако выход.....но ты про FastLib слышал? вроде как на DelphiGFX даже на него сcылочка была


Soft(Unpowered Kiborg)   (2002-08-05 01:23:00) [2]

Спасибо уже решил проблемму. Создаю в рантайме объект Tpicture. Через битмап рисую а затем вывожу на Canvas. Без тормозов и мигания.

Правда в 1280x1024 32bit цвет на моем K6-350 подтомаживает:)


MJH   (2002-08-04 17:47:00) [3]

тебе сказал в чем проблема....
короче....на OnPaint делаешь bitblt()
бэкграунд забиваешь как я сказал
на отрисовку тоже bitblt()


Goobit   (2002-08-04 17:40:00) [4]

Для TPaintBox можно, конечно, сделать буфер в виде TBitmap с такими же размерами и в OnPaint рисовать туда, а потом копировать этот буфер уже на канву TPaintBox"а.

А вообще можно сделать наследника от TCustomPanel (или вообще от TWinControl), где есть public-свойство DoubleBuffered, которое создает такой буфер при каждой перерисовке автоматически. В классе переопределяешь метод TCustomPanel.Paint и рисуешь в канву панели все, что угодно. И только после выхода из метода класс перерисует все окно целиком (в TWinControl.WMPaint).


Soft(Unpowered Kiborg)   (2002-08-04 16:27:00) [5]

Спасибо, но не подойдет. У меня при перерисовки топологии инет-сети происходит перетирка старых image-й при помощи

Canvas.Rectangle(Rect);

Это и приводит к миганию. Мне нужно чтоб можно было отключить изменения, нарисовать и потом чтоб все нарисованное обновилось.

Может создавать свой Canvas рисовать на нем и присваивать текущему? Какие здесь проблеммы ожидаются?


MJH   (2002-08-04 15:18:00) [6]

делаешь оверрайд на класс TPaintBox,
в котором отключаешь перерисовку бэкграунда

type TMyPaintBox=Class(TPaintBox)
private
procedure WMERASEBKGND(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
end;

implementation
procedure TMyPaintBox.WMERASEBKGND(var Msg: TWMEraseBkgnd);
begin
//Stops flicker
end;

соответсвенно нужно будет эту компоненту зарегистрировать
RegisterComponents();


Наверх

Титульная страница Поиск, карта сайта Написать письмо