Панорама, Как сделать панораму? |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Панорама, Как сделать панораму? |
Alx |
Сообщение
#1
|
Гость |
Люди, подскажите пожалуйста. Мне необходимо сделать панораму. Длинная кортинка, которая едет по форме. Но когда я двигаю компонент Image по форме image.left:=image.left+1 картинка как будто мерцает и на какоето время пропадает. Мне сказали что так сделать не получится. А как же тогда мне сделать панораму? Заранее спасибо! Alx
|
BlackShadow |
Сообщение
#2
|
Гость |
Проще всего было бы через DX... С простым TImage это не думаю, что пройдёт...
|
Guest |
Сообщение
#3
|
Гость |
:p2: А тогда, соответственно, вопрос. В двух словах - что такое DX? Это какойто компонент?
|
BlackShadow |
Сообщение
#4
|
Гость |
В общем случае - нет DX - Это уж совсем кратко от DirectX Хотя и компоненты такие есть...
|
P@sh@ |
Сообщение
#5
|
Бывалый Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: 2 |
DX - это видимо DirectX, компонент, ага... только не дельфы, а винды...
но и без него можно сделать кое-что: var Bmp: TBitmap; блок из Bitmapа размером с форму Form1, только с горизонтальным смещением offset копируется прямо на форму Form1 и не забудь добавить строчку DoubleBuffered, чтоб не моргало при перерисовке... вот, только что сделал для проверки: unit Unit1; на форме только Timer1 |
Alx |
Сообщение
#6
|
Гость |
Вау какой код. ОГРОМНЫЙ РЕСПЕКТ и человеческое СПАСИБО. Вечером попробую включить.
|
BlackShadow |
Сообщение
#7
|
Гость |
Да, вот про DoubleBuffered я и не подумал А под DX есть и дельфийские компоненты, с которыми всё довольно легко получается. Там инкапсулирована вся работа с интерфейсами, так что пишешь как под GDI через Canvas
|
Guest |
Сообщение
#8
|
Гость |
Так этот код не будет работать? Я даже не знаю что такое DoubleBuffered... Ладно, лезу в интернет искать ДиректХ.
|
BlackShadow |
Сообщение
#9
|
Гость |
DoubleBuffered, это когда форма поддерживает что-то типа того, что в DOS'е называелось видеостраницами. Т. е. когда есть возможность рисования "в какой-то кусок памяти", который в последствии подставляется на место видеопамяти. Т. к. такой вариант заметно превосходит по скорости все другие, то мерцание исчезает. В DX есть такие BackBuffers, которые именно это и представляют.
|
Alx |
Сообщение
#10
|
Гость |
Дааа. Нашел я какие-то тексты по изучению DirectX (DelphiX).... Это не для меня. Я пока не настолько крут в программировании. BlackShadow, а почему не будет работать тот код который ты тут написал??? Неужели на Делфи так трудно сдвинуть картинку с места (без мирцания)?
|
BlackShadow |
Сообщение
#11
|
Гость |
Я тут код написал???
Тот код, что присла P@sh@ вполне может и отработать. Очень даже может. Я же этого и не отрицал... Попробуй. DX просто круче Посмотрю дома модули. У меня вроде было что-то по-круче чем DelphiX, который только интерфейсы и описывает... |
P@sh@ |
Сообщение
#12
|
Бывалый Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: 2 |
DoubleBuffered просто включает режим, когда Canvas формы становится как бы невидимым, дублируется в памяти, и все рисование делается на нём, а на экран выводится уже готовая картинка, мерцания нет, потому что на экране ничего не ПЕРЕрисовывается...
PS: этот режим памяти больше требует... DirectX штука несложная, если не лезть в Direct3D, а ограничиться только прямым доступом к видеопамяти... само собой, это будет намного быстрее GDI |
Alx |
Сообщение
#13
|
Гость |
Люди, а вот посмотрите. В том коде, который написал P@sh@ я объединил 2 процедуры.
Код procedure TForm1.FormCreate(Sender: TObject); begin doublebuffered:=true; Bitmap := TBitmap.Create; Bitmap.LoadFromFile('EARTH2.bmp'); end; procedure TForm1.Timer1Timer(Sender: TObject); begin x:=x-1; repaint; Canvas.CopyRect(clientrect,Bitmap.Canvas,rect(x,0,x+clientwidth,clientheight)); end; Так можно делать? Но у меня все равно мирцание!!! И присутствие строчки doublebuffered:=true ничего не меняет. А вот если убрать repaint, то тогда мирцание изчезает. Но тогда за рисунком остается размазаный след от него. Ну мирцание же не может быть из за того, что у меня Делфи 5??? Сообщение отредактировано: APAL - |
BlackShadow |
Сообщение
#14
|
Гость |
Это не из-зп версии Delphi. Я бы посоветывал тебе добавить ещё и InvalidateRect после изменения положения картинки.
|
Alx |
Сообщение
#15
|
Гость |
А вот если я в коде убираю repaint, то тогда мирцание изчезает. Но тогда за рисунком остается размазаный след от него. Но этот след тогда у меня будет оставаться под картинкой и за пределами формы. Этот след не занимает много памяти. Это не картинка на картинке на картинке?
А вот InvalidateRect; - это селая строчка? Там никакие парамерры не нужны? |
Бродяжник |
Сообщение
#16
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
procedure TForm1.Timer1Timer(Sender: TObject); Так, конечно, будет мерцать. Потому что Вы сначала делаете repaint, то есть побуждаете форму перерисоваться, и сразу же после этого вручную на нее накладываете битмап. А вообще нужно так, как было у Паши, потому что если Вы сделаете отрисовку в таймере, а не в OnPaint, тогда при сворачивании, перекрывании и другими манипуляциями с Вашим окном, система будет слать ему WM_PAINT, и перерисовка формы будет перебивать отрисовку в таймере. Наверное, по этому поводу можно где-то прочесть лучше, чем я пишу, но все же попробую объяснить. Когда мы рисуем через Canvas.CopyRect и другие методы канвы, это, так сказать, наше личное дело. Мы чегой-то нарисовали, и окно не обязано об этом помнить. Если после нашего рисования окно было временно перекрыто другим, то после этого на месте нашего рисования останется область, залитая фоновым цветом окна. Восстанавливая свой вид, окно нарисовало лишь то, о чем ему было известно: свой фон, рамку, заголовок и подчиненные контролы. А вся наша графика улетучилась. Чтобы этого избежать, всю подобную графику принято помещать в обработчик события OnPaint, каковое событие генерируется при перерисовке окна. В этом случае при каждой перерисовке окна программа будет рисовать и наши художества. А для того, чтобы заставить окно принудительно перерисоваться, и используются repaint и invalidaterect. Неплохо бы Вам попробовать немного без VCL попрограммировать, с чистым API, так сказать... много узнаете интересного. |
Alx |
Сообщение
#17
|
Гость |
Но так как написал P@sh@ у меня не как не выходит. Я не понимаю что вызывает процедуру
Код procedure TForm1.FormPaint(Sender: TObject); begin Canvas.CopyRect(clientrect,Bitmap.Canvas,rect(x,0,x+clientwidth,clientheight)); end; У меня почему то после запуска программы форма остается совершенно пустая. Сообщение отредактировано: APAL - |
BlackShadow |
Сообщение
#18
|
Гость |
Цитата потому что если Вы сделаете отрисовку в таймере, а не в OnPaint, тогда при сворачивании, перекрывании и другими манипуляциями с Вашим окном, система будет слать ему WM_PAINT, и перерисовка формы будет перебивать отрисовку в таймере. А вот это не надо Свёрнутое окно не рисует на своей канве. Всё, что оно может делать это рисовать в taskbar'е себя как-то иначе. Например - WinAmp, прокручивающий там название играющей песни. Цитата всю подобную графику принято помещать в обработчик события OnPaint Вот тут полностью согласен. Цитата Неплохо бы Вам попробовать немного без VCL попрограммировать, с чистым API, так сказать... много узнаете интересного. Золотые слова InvalidateRect трбует Handle окна (Form1.Handle например) и естественно сам Rect, который перерисовывать. Идея такая: сместил свою картинку, получил "след", вычислил габариты этого следа и произвёл Invalidate на этом кусочке. По сравнению с перерисовкой всей формы выигрыш обеспечен |
Guest |
Сообщение
#19
|
Гость |
Ну а почему у меня процедура не вызывается?:
Код procedure TForm1.FormPaint(Sender: TObject); begin Canvas.CopyRect(clientrect,Bitmap.Canvas,rect(x,0,x+clientwidth,clientheight)); end; Только если можно - человечискими словами..... а то какие-то Invalidate, WM_PAINT и API Сообщение отредактировано: APAL - |
Бродяжник |
Сообщение
#20
|
Бывалый Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: 3 |
BlackShadow
"Свернутое окно не рисует на своей канве". И то верно! :D Надо точнее излагать свои мысли. Я хотел сказать, что если его потом развернуть обратно... to AIx Ладно уж, берите, только не говорите, что оно опять не работает... Меньшего мерцания Вы едва ли добьетесь средствами GDI. Прикрепленные файлы Panorama.zip ( 199.07 килобайт ) Кол-во скачиваний: 260 |
Текстовая версия | 28.03.2024 17:37 |