Дмитрий |
Отправлено: 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
|
а пробовали
написать?
|
|
Дмитрий |
Отправлено: 04.11.2003, 22:17 |
|
Не зарегистрирован
|
Георгий, как ни странно заработало. Но все равно мерцает!!! по изображению пробегает серая полоска когда они подменяются.
Я уже и не знаю что делать. |
|
Георгий |
Отправлено: 04.11.2003, 23:41 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
А вот это тоже мерцает?
|
|
Георгий |
Отправлено: 04.11.2003, 23:50 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
Посмотри лучше эту:
Какая из 3-х мерцает?
|
|
xTrim |
Отправлено: 06.11.2003, 16:47 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
Вроде так не моргает.
Только билдер 6, сорри.
Отредактировано xTrim — 06/11/2003, 17:55
|
|
Дмитрий |
Отправлено: 06.11.2003, 19:08 |
|
Не зарегистрирован
|
xTrim, работает и не моргает. Все как надо. Спасибо! Да и мысль у меня родилась, что не моргает только PaintBox, а компонент Image всегда моргать будет. Разработчики этого компонента не подумали, что его могут использовать в таких анимационных целях.
Кстати RXLIB GifAnimator тоже моргает, а когда много таких компонентов на форму лепишь и еще если gif файлы большие то билдер сплошные ошибки выдает. Даже не дает файл картинки в компонент загрузить при проектировании формы. |
|
|