TImage в Builder v 6.0
Привет всем. Была написана программа на Бьюлдере 5 выводящая простую анимацию 20-30 кадров в сек. (Для синхронизации использовалась апишная функция ГетТикКаунт()) Все было впорядке. Перекомпилировал этот проект на Бьюлдере 6. началось блыманье при перерисовке, даже при 3-5-10 кадрах в сек!!! И немогу его никак убрать. Может кто-ниб. подскажет как.
Я бы посоветовал использовать TTimer. Покажи свой код, тогда проблема станет яснее.
Я бы посоветовал использовать TTimer. Покажи свой код, тогда проблема станет яснее.
Использование ТТаймер почемуто дает зависимость происхождения события ОнТайм от движения мыши по форме!!! (я это пробывал на 5-м Бьюлдере). С апишной ГетТикКоунт можно горазда точнее... да и в этой задаче это не важно (блыманье с этим не связанно) Вчера нашел способ убирания его при помощи установления свойства формы Прозрачность в Истинну. А свойство величина_прозр. осатляю в 255 (т.е. форма не прозрачна по сути) Блымы - пропадают!!! Но этот трюк не работает если прогу запускать в Win98,95. (А это нужно!) Т.е. выходит оно появляется в какомто смысле скорее из-за формы чем картинки.
Если интересно попробый любую анимацию через Имаге в Бьюлдере 6 через Таймер или без него это скорее всего не важно. и будет быманье даже при малых fps. Например такй код.
TButton::Clic(...)
{
for(...)
{
...
if(...) // Прорисовка кадра
{
...
Image1->Canvas->Rectangle(...);
Image1->Canvas->Elipse(...);
...
}
Application->ProceseMessage();
}
}
Использование ТТаймер почемуто дает зависимость происхождения события ОнТайм от движения мыши по форме!!! (я это пробывал на 5-м Бьюлдере). С апишной ГетТикКоунт можно горазда точнее... да и в этой задаче это не важно (блыманье с этим не связанно) Вчера нашел способ убирания его при помощи установления свойства формы Прозрачность в Истинну. А свойство величина_прозр. осатляю в 255 (т.е. форма не прозрачна по сути) Блымы - пропадают!!! Но этот трюк не работает если прогу запускать в Win98,95. (А это нужно!) Т.е. выходит оно появляется в какомто смысле скорее из-за формы чем картинки.
Если интересно попробый любую анимацию через Имаге в Бьюлдере 6 через Таймер или без него это скорее всего не важно. и будет быманье даже при малых fps. Например такй код.
TButton::Clic(...)
{
for(...)
{
...
if(...) // Прорисовка кадра
{
...
Image1->Canvas->Rectangle(...);
Image1->Canvas->Elipse(...);
...
}
Application->ProceseMessage();
}
}
Вот здесь лежит Энциклопедия Builder качни ее там хороший пример по анимации. Я бы сделал как там через два TImage.
Вот здесь лежит Энциклопедия Builder качни ее там хороший пример по анимации. Я бы сделал как там через два TImage.
Закачал. Прочитал. (оказалось что такая экциклоп. лежит (более точно валяется) на винте :)) Сделал прорисовку в ЗаднийБуфер а из него копированием через Canvas->Draw(...) и также через Canvas->CopyRect(...) делал ... в Win98 все равно блымает!!! Я всеже думаю это из-за ТФорм...
Закачал. Прочитал. (оказалось что такая экциклоп. лежит (более точно валяется) на винте :)) Сделал прорисовку в ЗаднийБуфер а из него копированием через Canvas->Draw(...) и также через Canvas->CopyRect(...) делал ... в Win98 все равно блымает!!! Я всеже думаю это из-за ТФорм...
Может быть. Нужно исходники посмотреть и сравнить 5 и 6 стройки.
ЗЫ Там вообще мутотня с AlphaBlend и AlphaBlendValue постоянная. Слои какие-то добавляют. Может в этом фишка? На перерисовку больше времени уходит вот и блымкает.
Может быть. Нужно исходники посмотреть и сравнить 5 и 6 стройки.
ЗЫ Там вообще мутотня с AlphaBlend и AlphaBlendValue постоянная. Слои какие-то добавляют. Может в этом фишка? На перерисовку больше времени уходит вот и блымкает.
Интересный нюанс. Имаге блымает всегда цветом фона того компонента на который он положен. Какбудто этот компонетн до каждой перерисовки картинки заполняет все это место своим цветом. А потом картинка перерисовывается. Присоеденю исходник для Бьюлдера-6. Если можешь посмотри, но там все по обычному... Ты писал "посмотреть и сравнить" - исходники для 5 и 6 одни и теже, ехе-ими созданный работает по разному.
Интересный нюанс. Имаге блымает всегда цветом фона того компонента на который он положен. Какбудто этот компонетн до каждой перерисовки картинки заполняет все это место своим цветом. А потом картинка перерисовывается. Присоеденю исходник для Бьюлдера-6. Если можешь посмотри, но там все по обычному... Ты писал "посмотреть и сравнить" - исходники для 5 и 6 одни и теже, ехе-ими созданный работает по разному.
{
[COLOR=red]this->DoubleBuffered = true;[/COLOR]
//Сделай вот так и мигать не будет
if(BitBtn1->Caption == "Start")
{
BitBtn1->Caption = "Stop";
fe = false;
}
Интересный нюанс. Имаге блымает всегда цветом фона того компонента на который он положен. Какбудто этот компонетн до каждой перерисовки картинки заполняет все это место своим цветом. А потом картинка перерисовывается. Присоеденю исходник для Бьюлдера-6. Если можешь посмотри, но там все по обычному... Ты писал "посмотреть и сравнить" - исходники для 5 и 6 одни и теже, ехе-ими созданный работает по разному.
Естественно оно будет мигать.
В виндах есть такое сообщение WM_ERASEBKGND которое по умочланию приходит к каждому контролу в результате чего тот перерисовывается. Бороться с этим можно несколькими путями - самый простой - использовать свойство DoubleBuffered. Второе - сделать свой контрол, в котором в WndProc отлавливать сообщение WM_ERASEBKGND и обламывать его. В таком случае, фон контрола отрисовываться не будет. Теоретически есть еще один вариант - правда никогда не пробовал - попробовать Brush канвы контрола установить в bsNone.