C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
BitBlt и работа с грфическими файлами, Мерцание (глюки) картинки на форме.
Дмитрий
  Отправлено: 31.10.2003, 18:56


Не зарегистрирован







Подскажите, как избежать мерцания картинки на форме? Задача такая: взять допустим 20 разных картинок и показывать их поочереди с очень маленькой задержкой по времени (45 мс).
У меня как я ни делал получается мерцание, т.е. при замене картинок (когда ставишь замену в цикл) по картинке бегает "глючная" полоса. И чем больше размер картинки, тем больше этих глюков валит. Не пойму в чем причина...
Вот один из вариантов как я пытался сделать:
Dest1 — это компонент Image, где показываются картинки.
Image1...Image5 — скрытые компоненты Image, где хранятся исходные картинки.


for(int i=1; i<=10; i++)
{
BitBlt(Dest1->Canvas->Handle,0,0,Image1->Width,Image1->Height,Image1->Canvas->Handle,0,0,SRCCOPY);
Delay(45);
Dest1->Refresh();
BitBlt(Dest1->Canvas->Handle,0,0,Image2->Width,Image2->Height,Image2->Canvas->Handle,0,0,SRCCOPY);
Delay(45);
Dest1->Refresh();
BitBlt(Dest1->Canvas->Handle,0,0,Image3->Width,Image3->Height,Image3->Canvas->Handle,0,0,SRCCOPY);
Delay(45);
Dest1->Refresh();
BitBlt(Dest1->Canvas->Handle,0,0,Image4->Width,Image4->Height,Image4->Canvas->Handle,0,0,SRCCOPY);
Delay(45);
Dest1->Refresh();
BitBlt(Dest1->Canvas->Handle,0,0,Image5->Width,Image5->Height,Image5->Canvas->Handle,0,0,SRCCOPY);
Delay(45);
Dest1->Refresh();
}
seg_r
Отправлено: 01.11.2003, 08:39


Дежурный стрелочник

Группа: Участник
Сообщений: 74



рисуй на TBitmap а потом разом обновляй Canvas

Canvas->Draw(0,0,TBitmap)

Мерцания точно не будет...
Дмитрий
Отправлено: 02.11.2003, 18:58


Не зарегистрирован







Все равно мерцает. Может я что не так делаю?
Вот код:

for(int i=1; i<=10; i++)
{
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/0.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/1.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/2.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/3.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/4.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/5.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/6.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
Image1->Picture->Bitmap->LoadFromFile("d:/dima/stolbik2/7.bmp");
Image1->Canvas->Draw(0,0,Image1->Picture->Bitmap);
Delay(45);
}
Георгий
Отправлено: 02.11.2003, 20:00


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Мне уже даже интересно стало — почему у кого то что то где то мерцает, но тут я увидел код... И мне всё стало ясно:)
попробуй вот так написать:
CODE
AnsiString Path="d:\\temp\\";
AnsiString Ext =".bmp";
AnsiString fName="";
unsigned int i,j;

vector<Graphics::TBitmap*> Images;
Images.resize(7,NULL);

try{
for(i=0; i<Images.size(); i++)
       {
       fName=Path+AnsiString(i)+Ext;
       Images[i]=new Graphics::TBitmap;
       if (!Images[i]) throw Exception("Íå óäàëîñü ñîçäàòü ýêçåìïëÿð TBitmap");
       Images[i]->LoadFromFile(fName);
       };

for (j=0; j<10; j++)
       for(i=0; i<Images.size(); i++)
       {
       Image1->Canvas->Draw(0,0,Images[i]);
       Application->ProcessMessages();
       Sleep(45);
       }
}
__finally
       {
       for (i=0;i<Images.size();i++)delete Images[i];
       Beep();
       };


Отредактировано Георгий — 02/11/2003, 21:08
Дмитрий
Отправлено: 04.11.2003, 01:07


Не зарегистрирован







Не работает, Выдает ошибку Undefined symbol "vector".

Если Вам не сложно, киньте исходники мне на почту: webmaster@mymebel.com

Заадча к проге такая:
Надо, чтобы допустим 10 картинок замещали друг друга с задержкой 40-45 мс без мерцания. Картинки в формате .jpg , но можно и .bmp.
Желательно код с комментариями.

Спасибо огромное всем кто откликнулся.
Георгий
Отправлено: 04.11.2003, 02:27


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а пробовали
CODE
#include <vector.h>

написать?

User Attached Image Скачать файл
Anime.rar


Дмитрий
Отправлено: 04.11.2003, 22:17


Не зарегистрирован







Георгий, как ни странно заработало. Но все равно мерцает!!! по изображению пробегает серая полоска когда они подменяются.

Я уже и не знаю что делать.
Георгий
Отправлено: 04.11.2003, 23:41


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



А вот это тоже мерцает?


User Attached Image Скачать файл
Anime.rar


Георгий
Отправлено: 04.11.2003, 23:50


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Посмотри лучше эту:
Какая из 3-х мерцает?

User Attached Image Скачать файл
Anime.rar


xTrim
Отправлено: 06.11.2003, 16:47


Машинист паровоза

Группа: Участник
Сообщений: 208



Вроде так не моргает.

Только билдер 6, сорри.

Отредактировано xTrim — 06/11/2003, 17:55

User Attached Image Скачать файл
Anime.zip


Дмитрий
Отправлено: 06.11.2003, 19:08


Не зарегистрирован







xTrim, работает и не моргает. Все как надо. Спасибо! Да и мысль у меня родилась, что не моргает только PaintBox, а компонент Image всегда моргать будет. Разработчики этого компонента не подумали, что его могут использовать в таких анимационных целях.

Кстати RXLIB GifAnimator тоже моргает, а когда много таких компонентов на форму лепишь и еще если gif файлы большие то билдер сплошные ошибки выдает. Даже не дает файл картинки в компонент загрузить при проектировании формы.

Вернуться в Вопросы программирования в C++Builder