Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форма "моргает". Как сделать перерисовку быстрой? 
:(
    Опции темы
Гость_Александр
  Дата 27.6.2004, 11:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Добрый день!

Пишу программу, которая строит расписание дежурств. На самой важной форме, отображающей это самое расписание визуально, сидит чёртова туча компонентов.

И когда форма по какой-то причине (изменение размера, открытие-закрытие панели и т.п.) отрисовывает себя по новой, это выглядит, как нервный тик - всё начинает "моргать" и дёргаться.

Прошёл по списку компонентов, выставил всем DoubleBuffer. "Моргать" перестало, но время отрисовки формы выросло настолько, что можно чуть ли не кофе попить, пока она приводит себя в порядок.

Думаю, я не первый сталкиваюсь с такими вещами. Кто уже решал подобные проблемы - поделитесь опытом, плиз! Спасибо заранее.

  Вверх
Borland_Delphi_6
Дата 27.6.2004, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



У меня похожая проблема: Timage должен двигаться, из-за этого его сильно глючит sad.gif Кто-нибудь знает решение подобных проблем?


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
ZLDO
Дата 27.6.2004, 12:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Зачем двигать TImage? Нужно двигать изображение на TImage, а чтобы не моргало нужно всё прорисовывать в памяти (например временных TBitmap), а потом за один раз выдавать на экран - ...Canvas.Draw или BitBlt
  Вверх
<Spawn>
Дата 27.6.2004, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Гость_Александр у тебя какая машина, что так тормозит от DoubleBuffered? И зачем для каждого контрола ее выставлять? Достаточно для формы поставить. У тебя точно на таймерах\потоках ни чего не сидит?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_Александр
Дата 28.6.2004, 13:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Машина - второй пень. Тормозит она не так страшно, но задержка в несколько секунд с прорисовкой - это хреново. Просто на форме много всякого понавешано.

Насчёт DoubleBuffered для формы - ты знаешь, если выставить для формы или если выставить для каждого компонента, программа ведёт себя по-разному.

  Вверх
dm9
Дата 29.6.2004, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 3
Всего: 137



Borland_Delphi_6, насчёт TImage.
Передо мной стояла задача периодической перерисовки изображения - всё работало очень плавно. Двигать Image - изврат. Я бы просто перерисовывал изображение на канве парента с новыми координатами. Делается так.

Сам обработчик onPaint:
Код
var
  Bitmap     : HBITMAP;
  BitmapInfo : TBitMapInfo;


Код
procedure TESSGMainForm.pbPaint(Sender: TObject);
var
  MemDC : HDC;
  bm    : TBitmap;
begin
  MemDC := CreateCompatibleDC(pb.Canvas.Handle);
  SelectObject (MemDC, Bitmap);
  GetObject (Bitmap, SizeOf (TBITMAP), @bm);
  BitBlt (pb.Canvas.Handle, 0, 0, pb.Width, pb.Height, MemDC, 0, 0, SRCCOPY);
  DeleteDC (MemDC);
end;


(Подумав) О, Господи. А теперь надо рассказать, как по-простому загрузить картинку в HBitmap, как использовать CreateDIBSection...

А сейчас 5 утра.
В общем, извините. Если ЭТО кому-то надо - будет. Если нет - то нет.
Просто сейчас писать про всё это очень не хочется... smile.gif
Добавлено @ 04:03
Если интересно - напишите, и завтра я опишу всё подробно.
PM MAIL ICQ   Вверх
Borland_Delphi_6
Дата 29.6.2004, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



dm9
Нужно, нужно smile.gif В общем, у меня есть jpeg, его нужно туда-сюда по форме таскать


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
dm9
Дата 2.7.2004, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 3
Всего: 137



Borland_Delphi_6, что-то я тогда загнался smile.gif
DIB - это хорошо, но в данном случае совершенно ни к чему.
Просто создаёшь динамически j : TJPEGImage, грузишь туда картинку и затем отрисовываешь картинку на форме:
Form1.Canvas.Draw (X, Y, j);

Единственное, можно допустить такую ошибку. На таймере или как там поставить изменение координат X и Y, и затем написать Form1.Repaint или Form1.Refresh. Тогда будет моргать. А надо писать просто Form1.Canvas.Draw (X, Y, j). Всё плавно - я проверил. На на onPaint форсы тоже на забыть отрисовку.

А то тут хотел уж рассказывать, как работать с DIB и DDB smile.gif Отдохнуть просто надо - я слишком долго занимался этими DIB - зациклился уже.
PM MAIL ICQ   Вверх
Borland_Delphi_6
Дата 3.7.2004, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



Цитата
На на onPaint форсы тоже на забыть отрисовку.

Смысл этого предложения мне не понятен... withstupid.gif
И еще. Вот у меня был такой код:
Код
if Image1.Left>=(Form1.ClientWidth-5)-Image1.Width
then gx:=-gx;
if Image1.Top>=(Form1.ClientHeight-5)-Image1.Height
then gy:=-gy;
if Image1.Top<=0
then gy:=-gy;
if Image1.Left<=0
then gx:=-gx;
Image1.Left:=Image1.Left+gx;
Image1.Top:=Image1.Top+gy;

(это что-то вроде скринсевера)

Как мне теперь узнать аналог Image1.Left и Image1.Top?


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
dm9
Дата 4.7.2004, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 3
Всего: 137



Borland_Delphi_6, в простейшем случае я имел в виду это (см. файл).
Если более сложно - там надо писать ещё обработчик onPaint для формы и делать не столь халявную перерисовку.
Добавлено @ 01:39
PS Там что-то типа 5 килобайт...

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  Draw.zip
PM MAIL ICQ   Вверх
Borland_Delphi_6
Дата 4.7.2004, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



dm9
Спасибо, примерчик очень хороший! Тока я взялся попробовать написать эту прогу на API, а то уж слишком большая она получается. smile.gif


--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
dm9
Дата 4.7.2004, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 3
Всего: 137



Borland_Delphi_6, О! А вот здесь тогда как раз понадобится работа с DIB smile.gif
И отрисовку делать надо будет, как я написал.

Будет время - скину примерчик.
PM MAIL ICQ   Вверх
Borland_Delphi_6
Дата 4.7.2004, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


LoneLINEss
****


Профиль
Группа: Участник Клуба
Сообщений: 2509
Регистрация: 5.11.2002
Где: in fortune dreams ...

Репутация: нет
Всего: 20



dm9
Спасибо, как раз хотел тебе попрасить об этом rolleyes.gif Точнее, вывести пикчуру я уже научился, вот так вот:
Код
bmp:=LoadImage(0,'img.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
WindowDc:=GetDC(MainWnd);
memorydc:=CreateCompatibleDC(windowdc);
SelectObject(memorydc,bmp);
BitBlt(windowdc,x,y,200,150,memorydc,0,0,SRCCOPY);
DeleteDC(memorydc);
ReleaseDC(MainWnd,windowdc);



--------------------
Blind Guardian Fan :: BMSTU Student :: A polar bear is a rectangular bear after a coordinate transform.

Мои фотографии
PM MAIL WWW   Вверх
dm9
Дата 5.7.2004, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 3
Всего: 137



Вот тебе примерчик отрисовки, всё на чистом WinAPI. (Не мой).
Что там тебе ещё надо. Таймер? smile.gif

Да, и не забывай всякие DeleteDC, DeleteObject, etc.

Кстати, мои эксперименты показывают, что при такой отрисовке BeginPaint и EndPaint не спасают от мерцания почему-то... Это если движение картинки делать.
Добавлено @ 17:04
PS Компиляция - запуск батника. Там < 30 кБайт.

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  Dib__s.zip
PM MAIL ICQ   Вверх
Albinos_x
Дата 5.7.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 1
Всего: 108



имеются две фазы обновления окна.
1. привыводе окна винда посылает сообщение WM_ERASEBKGND, оповещяющее онеобходимости стирания фона перед процедурой рисования. Затем посылается сообщение WM_PAINT, служащее сигналом для закрашивания.
Первое сообщение можно пропустить
а) форсируя обновление самому с помощью вызова функции InvalidateRect(Handle, Nil, False) ;
б) Можно указать VCL не стирать фон
ControlStyle := ControlStyle + [csOpaque];

В этом случае от моргания можно избавиться.

PS: Второй выриант в ХР не срабатывает почему-то (имею ввиду, что всё равно моргает), первый не проверял, но работать должен.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0939 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.