Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Анимация   Найти похожие ветки 

 
Аним   (2004-07-27 19:09) [0]

Вопрос общего плана:
Как можно сделать анимацию наиболее плавно?
Чтоб при передвижении объекта не было мельканий (при стирании и рисовки заново)?
Но с учетом того, что задний фон динамически меняется..

нужно любое:
алгоритм на словах.. основные функции.. в общем, любые мысли..
кто то ведь с этим уже сталкивался..

спасибо.


 
parovoZZ ©   (2004-07-27 19:13) [1]

Смотря на чём рисовать. В любом случае надо делать буферизацию или использовать DirectDraw (как альтернатива для медленной графики - GDI).


 
Аним   (2004-07-27 19:24) [2]

Рисую на канве.

Использую:
Canvas.Draw
Canvas.CopyRect

вывожу при помощи ч/б маски:
cmSrcAnd + cmSrcPaint

это GDI ?
я не знаком с этой терминалогией.. :((

а что еще для канвы можно?..
рисую все в памяти, потом вывожу..
но это же все не то........

ну на счет этого

> делать буферизацию


нельзя поподробней..
литры у меня нет..
может ссылку на статью.. или что-нибудь.....

а вообще, можно при помощи DirectDraw на канву?


 
Knight ©   (2004-07-27 19:50) [3]

Посмотри FastLib... для относительно простой графики самое оно... и ещё, мелькает у тебя скорее всего перерисовывающийся backgrount... смотри пример из в Delphi там есть.


 
parovoZZ ©   (2004-07-27 21:34) [4]

GDI: BitBlt(), StrechBlt(), TransparentBlt() ну и так далее. Это низкоурвневые функции WinApi для работы с графикой. Я так скринмэйта замутил, мерцаний - полный 0. Можно ещё здесь посмотреть http://delphigfx.mastak.ru/2d/012/2d_12.htm


 
Egloo   (2004-07-27 22:02) [5]

Да, FastLib - отличная альтернатива работы с TBitmap...
Все же если будешь делать без FL, советую следовать следующим пунктам:
1. Обработка сообщения окна WM_ERASEBKGND: Посылается для стирания фона окна (например, при изменении его размеров). Постоянная перерисовка фона, а затем наложение на фон твоей картинки приводит к неприятному мерцанию... Дабы фон не перерисовывался необходимо в процедуре-обработчике сообщения возвратить 0.
Делается это след. образом:

- в секции private своего компонента или формы объявить процедуру-обработчик:

private
...
 procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
...


- в разделе реализации просто вернуть 0:

procedure TSomeForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
 Message.Result := 0;
end;


Теперь уже о закраске фона мы должны позаботиться сами (см.ниже)

2. Используйте двойную буферизацию выводимой графики: Машиной на последовательное наложение на форму, например, линий или залитых областей в реальном времени тратится определенное количество ресурсов, в следствие чего, заметны  последовательность и мерцание... Чтобы этого избежать, необходимо все (включая фон, т.к. мы переопределили его дефолтную закраску) рисовать на битмапе в памяти и затем уже выводить полученную картинку на экран:


procedure TSomeForm.Paint;
var
 memoryBitmap: TBitmap;
begin
 inherited;

 memoryBitmap := TBitmap.Create; // создаем битмап в памяти
 try
   memoryBitmap.Height := ClientRect.Bottom;
   memoryBitmap.Width := ClientRect.Right;

   // Рисуем фон
   memoryBitmap.Canvas.Brush.Color := Self.Color;
   
   ...
   ... что-то, что нам необходимо нарисовать ...
   ...

   // Копируем memoryBitmap на экран
   Canvas.CopyRect(ClientRect, memoryBitmap.Canvas, ClientRect);

 finally
   memoryBitmap.Free; // уничтожаем временную картинку
 end;
end;


Удачи! :)


 
Egloo   (2004-07-27 22:16) [6]

Кстати, а почему закрыли кладовку? :/


 
parovoZZ ©   (2004-07-27 23:19) [7]

Сейчас последует вопрос: а что такое FastLib? Отвечаю: http://delphigfx.mastak.ru/libs.htm , в самом низу страницы. А по-моему и GDI не плохо справляется.


 
Knight ©   (2004-07-28 02:06) [8]


> 1. Обработка сообщения окна WM_ERASEBKGND:

Можно и без этого, используя разные Инвалидейты...


 
parovoZZ ©   (2004-07-28 02:46) [9]

Ну на самом деле всё зависит от скорости анимации. Я обходился без WM_ERASEBKGND, и всё работало без мерцаний. Просто BitBlt рисует на контексте и забыват про это до следующей перерисовки. А перерисовка просто тупо накладывается на предыдущую, вот Вам и отсутствие мерцаний.


 
Аним   (2004-07-28 13:02) [10]

Спасибо за ссылки.. читаем..
А вот ето:

> parovoZZ ©   (27.07.04 21:34) [4]
> GDI: BitBlt(), StrechBlt(), TransparentBlt() ну и так далее.
> Это низкоурвневые функции WinApi для работы с графикой.
> Я так скринмэйта замутил, мерцаний - полный 0.


моно хочь exe на почту.. посмотреть хочется..


 
Аним   (2004-07-28 15:05) [11]

Почитал..
Оказывается я и делал вывод с бвойной буферизацией с исп. обычной маски (не программной)...

но это всек тому как быстрее, грамотнее рисовать кадры..

а как восстанавливать фон, чтобы поставить след. кард?
каким способом?

но нельзя хранить фон в буфере, а потом дважды буферизировать  и поверх всего опять ставить (не восстанавливая того, куда нарисовали), поскольку фон за это время мог уже измениться (по сравнению с тем, что в буфере)...
и этот буфер (с фоном) надо обновлять перед тем, как исп. двойную буферизацию для след. кадра...

вот я и писал

> с учетом того, что задний фон динамически меняется..


а?

p.s.
всвязи с этим
2 parovoZZ ©   (27.07.04 21:34) [4]:

может кусок сурсника по этой теме.. ?

;D


 
parovoZZ ©   (2004-07-28 21:08) [12]

А по-моему для таких целей не следует использовать канвас, а обращаться напрямую через дескриптор компонента. Например, для формы:

var
DC : HDC;
begin
DC := GetDC (Form1.Handle);
end;
После чего можно непосредственно рисовать на форме, но все перерисовки должна брать на себя программа. Геморно, но цена: отсутствие мерцаний.
Создай пустую форму, на неё кинь таймер, интервал в принципе не критичен, можешь поставить 10-ку. Скопируй вот этот код (на скорую руку, поэтому замечания от мастеров только по делу):

unit Unit1;

interface

uses
 Windows, Messages, Forms, Classes, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 k : integer;
 Picture1, Picture2 : cardinal;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
DCBuffer : HDC;
DCForm : HDC;
DCImage : HDC;
BufferBitmap : HBitmap;

begin
if k > 500 then k := 1 else inc (k);//Для анимации
DCForm := GetDC (Form1.Handle);//Берём дескриптор формы
BufferBitmap := CreateCompatibleBitmap (DCForm, 500, 130);//Создаём совместимую с контекстом формы картинку в памяти (наш буфер)

DCImage := CreateCompatibleDC (DCForm);//создаём дополнительные дескрипторы
DCBuffer := CreateCompatibleDC (DCForm);
SelectObject (DCBuffer, BufferBitmap);//Выбираем в созданные
SelectObject (DCImage, Picture1);//дескрипторы картинки
BitBlt (DCBuffer, 5, 0, 500, 130, DCImage, 0, 0, SrcCopy);//В памяти сперва рисуем фон

SelectObject (DCImage, Picture2);
BitBlt (DCBuffer, k + 5, 0, 500, 130, DCImage, 0, 0, SrcCopy);//затем также в памяти рисуем спрайт

BitBlt (DCForm, k + 5, 0, 500, 130, DCBuffer, 0, 0, SrcCopy);//После чего всё переносим из памяти на форму
SelectObject (DCBuffer, BufferBitmap);
DeleteObject (BufferBitmap);
DeleteDC (DCBuffer);
DeleteDC (DCImage);
ReleaseDC (Form1.Handle, DCForm);//Ну и удаляем всё к чёрту
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Picture1 := LoadImage (0, "fon.bmp", Image_Bitmap, 0, 0, LR_LOADFROMFILE or LR_CREATEDIBSECTION);//загружаем фон (размер не очень важен; у меня 640*480)
Picture2 := LoadImage (0, "Sprite.bmp", Image_Bitmap, 0, 0, LR_LOADFROMFILE or LR_CREATEDIBSECTION);//загружаем спрайт (у меня 96*96)
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteObject (Picture1);
DeleteObject (Picture2);
end;

end.



Картинки должны лежать в той же папке, что и EXE, названия файлов должны совпадать с теми, которые указаны в функции BitBlt.
В примере движется фон, но поверх него выводится спрайт, который тоже движется. На моём компе с WinXP мерцаний замечено не было совсем. В принципе по началу может показаться всё сложным, но после некоторой практики всё станет понятным.


 
Огромное Кулясищще ©   (2004-07-28 21:33) [13]

2 parovoZZ:

>В примере движется фон, но поверх него выводится спрайт, который тоже движется. На моём компе с WinXP мерцаний замечено не было совсем. В принципе по началу может показаться всё сложным, но после некоторой практики всё станет понятным.

А по-моему о мерцаниях речь не шла. BitBlt что с канвой, что без канвы - практически одно и то же. А вот когда вывод подвешен на таймер - о плавности говорить не приходится.


 
parovoZZ ©   (2004-07-28 21:56) [14]

Зато речь шла о мельканиях, что одно и тоже в данном контексте. Не нравится таймер, можно использовать DirectDraw. Там всё быстро и плавно. А плавность - плюс минус один пиксель, плавнее нельзя по определнию.


 
Огромное Кулясищще ©   (2004-07-28 22:58) [15]

>Зато речь шла о мельканиях, что одно и тоже в данном контексте.

Мелькание и плавность ну явно разные понятия. Можно на тех же BitBlt выводить изображение без мерцаний, но при этом не слишком быстро - и будет казаться, что объект движется рыками. Или же если во время анимации меняется загрузка процессора, то анимация ускоряется или замедляется. Этого тоже можно избежать.

>Не нравится таймер, можно использовать DirectDraw. Там всё быстро и плавно.

Если в DirectDraw использовать TTimer, то всё будет быстро, но никак не плавно. Кроме таких категоричных действий, можно использовать OnIdle, мультимедийный таймер или потоки.

>А плавность - плюс минус один пиксель, плавнее нельзя по определнию.

Увы, можно. Надеюсь, рисунок тебя убедит:
http://www.hot.ee/gelphi/pixel1.png


 
Аним   (2004-07-28 23:14) [16]

Да, класс..

Нет, сложным вовсе не показалось.. )) просто с этим столкнуся впервые.. и литры нет..

а тут.. отличный пример! (еще и напрямую, через дискрипторы)
бошое спасибо.

я достиг такого же эффекта (не мерцания), но не напрямую (на канве рисовал).

Единственное:
В твоем примере все рисуется в буфере и выводится потом через дискриптор формы на нее же..
Т.е. инфа, кот. ранее была на форме, после вывода твоей графики, потеряна.

Я же говоря о динамическом фоне, я имел ввиду то, что до этого (вывода твоего спрайта) на форме кто-то мог что-то выводить сам.. да хоть кружок..
а твое все его затрет.

говоря о динамическом фоне, я имел ввиду то, что фон - не картинка, а чужой дескриптор, кот. я не контролирую.... он чужой.

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

поэтому и заинтересовал твой screenmate.. ведь он обязан не затирать "чужое".
Как это у тебя делается?!
или ты что-то иное под screenmate имеешь ввиду, не передвигающийся спрайт на экране (чужом дискрипроре)?!

2 Огромное Кулясищще ©   (28.07.04 22:58) [15]
Никто и не путал мерцание с плавностью передвижения..
Вопрос звучал

> Чтоб при передвижении объекта не было мельканий (при стирании
> и рисовки заново)?
> Но с учетом того, что задний фон динамически меняется..

и о том и о другом, как выяснилось.. :).
Но на тот момент я думал именно о мерцании..
Плавность также оч. важный момент.

У тебя есть мысли, - выскажи.. что за споры.. )


> объект движется рыками

Как и какими средствами (через что, по-простому) можно добиться плавности как на твоей png?..

На счет этого все понятно:

> меняется загрузка процессора, то анимация ускоряется или
> замедляется
> можно использовать OnIdle, мультимедийный таймер или потоки.


 
parovoZZ ©   (2004-07-28 23:29) [17]

А кто мешает перед перерисовкой формы скинуть её содержимое в какой-нибудь буфер?
А скринмэйт (экранный помошник) это всего-лишь окно, которое движется по экрану, а перерисовка окон, находящегося под ним, это забота вынды. По крайней мере, я ей так приказал делать.


 
parovoZZ ©   (2004-07-28 23:39) [18]

Да, я чего ещё подумал. В моём скринмэйте нет буферизации, но он всё равно не мерцает при перерисовке. Правда он написан полностью на апях. А вот попробовал убрать из вышеприведённого кода буфер, появились мерцания. Видимо VCL сам себе на уме.
А по поводу плавности: пиксель - это минимальная еденица отображения информации на мониторе. Хотим мы этого или не хотим, но перемещатся спрайт всё равно будет дискретно, но, как видно из рисунка, мы можем обмануть глаз и сделать перемещение как-бы  плавным.


 
Огромное Кулясищще ©   (2004-07-28 23:40) [19]

2 Аним:

>Рисую на канве.

Использую:
Canvas.Draw
Canvas.CopyRect

вывожу при помощи ч/б маски:
cmSrcAnd + cmSrcPaint


Ты мне скажи, что ты делаешь, чтобы у тебя мерцало. Не допираю никак.

>Как и какими средствами (через что, по-простому) можно добиться плавности как на твоей png?..

Нужно применить сглаживание к пикселю (antialiase). Грубо говоря, чем больше площадь лежит на одном из четырёх занимаемых пикселей, тем непрозрачней цвет.


 
Огромное Кулясищще ©   (2004-07-28 23:43) [20]

>Видимо VCL сам себе на уме.

Видимо без буфера VCL делает то, что ты ему задаёшь делать, а именно: нарисовать на окне, обновить окно, нарисовать на окне, обновить окно.


 
parovoZZ ©   (2004-07-29 11:32) [21]

На этом сайте лежит скринмэйт Joffa, там картинка рисуется на Image-е, при этом заметны мерцания, я же делаю всё с помощью апей. Ничего не мерцает. В обоих случаях буфер не применяется.


 
Аним   (2004-07-29 17:52) [22]


> А кто мешает перед перерисовкой формы скинуть её содержимое
> в какой-нибудь буфер?

Так я на ее dc свою графику вывожу. Да, могу ее запомнить перед своим выводом, но после мне как затереть то, что я поверх нарисовал?! Поставить поверх то, что запомнил?! не-е.. это - устарелая инфа.. ее тоже надо обновить..
Ну и что же, не вызывать же инвалидейт?..
Вот и будет:

> без буфера VCL делает то, что ты ему задаёшь делать, а именно:
> нарисовать на окне, обновить окно, нарисовать на окне, обновить окно.



> А скринмэйт (экранный помошник) это всего-лишь окно, которое
> движется по экрану, а перерисовка окон, находящегося под
> ним, это забота вынды. По крайней мере, я ей так приказал
> делать.

Т.е. что, ты на канве своего окна рисуешь етого помошника, да?
спрайтового персоонажа..
Но оформлено это у тя как? в своем окне ты убрал границы и заместо фона окна ставишь тот фон, что под ним?! или как..
Как ты добился эффекта прозрачности, того, как-будто спрайт движется по столу?..


> Ты мне скажи, что ты делаешь, чтобы у тебя мерцало. Не допираю
> никак.

)) Так нет, мерцания нет (при статичном backgroung-е)..
Теперь остались только лишь скачки с пикселя на следующий....
Как я понял, от этого можно избывиться своеобразной размытостью границ спрайта на 1px?..

> Нужно применить сглаживание к пикселю (antialiase). Грубо
> говоря, чем больше площадь лежит на одном из четырёх занимаемых пикселей, тем непрозрачней цвет.

antialiase? и что это? а ссылок, что почитать по этому нет?..
хоть какие-нить keywords чтоб в хелпе глянуть..


> На этом сайте лежит скринмэйт

Интересно, где же.. кладовка почему-то закрыта..
В каком разделе?..


 
Огромное Кулясищще ©   (2004-07-29 18:00) [23]

>antialiase? и что это? а ссылок, что почитать по этому нет?..
хоть какие-нить keywords чтоб в хелпе глянуть..


Ссылок кинуть могу, но только по требованию. Можешь попробовать поработать с Graphic32 - там это всё реализовано, собственно, оттуда и пример.


 
Аним   (2004-07-29 18:06) [24]

что-то я ударился в screenmates.. ))

Вот:
http://grin.bip.ru/Progr/scmpoo.zip

барашек, кот. бегает по экрану..
качественный китайский screenmate..

его действительно рисуют в отдельним своем окне, а не выводят на чужой dc..
Но как тогда решена проблема с фоном?.. на котором его выводят.. он же постоянно меняется..

не важно двойной буферизацией или как-то еще..
с выводом спрайта вопросов нет..
а откуда они берут фон для использования пусть той же двойной буферизации на дискрипторе своего окна?.. это же фон экрана..


 
Аним   (2004-07-29 18:08) [25]


> Ссылок кинуть могу, но только по требованию.

Требую.. ))


 
Аним   (2004-07-29 18:12) [26]

Кстати говоря,
http://www.delphimaster.ru/cgi-bin/forum.pl/forum.pl/?id=1090418922&n=7


> Огромное Кулясищще ©   (21.07.04 20:29) [8]
> > Как можно рисовать быстрее GDI?
>
> www.g32.org  см. Graphic32
>
> > с помощью чего рисовать-то
>
> Вывод пикселя через прямоугольник 1х1. Попиксельно рисуй
> примитивы.


Ды?


 
Огромное Кулясищще ©   (2004-07-29 18:41) [27]

>Но как тогда решена проблема с фоном?.. на котором его выводят.. он же постоянно меняется..

Через регионы.


 
Огромное Кулясищще ©   (2004-07-29 18:43) [28]

>Требую.. ))

http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm
листай вниз до antialiasing

>Ды?

Именно.


 
parovoZZ ©   (2004-07-29 19:11) [29]

Извините, сижу в опере, потому на все вопросы ответы в кучу...
По скринмэйту: обрезаю форму регионом (можно сделать хоть дырку в окне).
Скринмэйт лежит где-то здесь, игрушка называется Joffa http://delphigfx.mastak.ru/game3.htm
to Аним:
могу лишь только посоветовать освоить DirectDraw; но всё-таки я не понял, что ты хочешь делать: рисовать в своём окне или рисовать в чужом? И что значит информация устарела? Это то, что при воспроизведении из буфера она будет накладываться на обновившуюся картинку? Так кто мешает запомнить картинку в этом же самом буфере и потом воспроизвести на экран?
BitBlt с флагом SRCCOPY просто накладывает новое изображение на старое, причём старое безвозвратно теряется.


 
Аним   (2004-07-29 19:24) [30]


> Через регионы.

Сомнительно..
Это самое простое, что можно подумать при попытке реализовать простейший screenmate..
но разве в паузу между изменением региона окна и выводом на измененный регион графики не произойдет мелькания?..
Или просто при изменении региона...
Тут никакая буферизация не поможет...
У них мелькания нет..
Правда и вывод не плавный.. с большим шагом..
Хотя надо попробовать..


> http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm
> листай вниз до antialiasing

спасибо, смотрим..


 
Аним   (2004-07-29 20:36) [31]


> могу лишь только посоветовать освоить DirectDraw;

все впереди.. я тока начал разбираться.. )

> но всё-таки я не понял, что ты хочешь делать: рисовать в
> своём окне или рисовать в чужом?

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

> BitBlt с флагом SRCCOPY просто накладывает новое изображение
> на старое, причём старое безвозвратно теряется.

Да, с этим все давно ясно..

> И что значит информация устарела? Это то, что при воспроизведении
> из буфера она будет накладываться на обновившуюся картинку?
> Так кто мешает запомнить картинку в этом же самом буфере
> и потом воспроизвести на экран?

Сейчас, разберусь со всем.. что-то уже сам запутался.. ))
А все потому, что уже не решаю конкретную задачу, а просто пробую.. т.с. изучаю..


 
Аним   (2004-07-29 20:44) [32]

Блиин.. а что, DelphiX тока для пятых делфей?
Выше нет негде?


 
Огромное Кулясищще ©   (2004-07-29 20:47) [33]

Косячки курить - это плохо. Так вот, по делу. Если менять реагион тогда, когда надо - никакие мелькания не возникнут.


 
parovoZZ ©   (2004-07-29 22:05) [34]

> Если менять реагион тогда, когда надо - никакие мелькания не возникнут.

А подробнее можно? Сейчас попробую. О результатах доложу.


 
Огромное Кулясищще ©   (2004-07-29 22:32) [35]

>А подробнее можно? Сейчас попробую. О результатах доложу.

Меняй, например, в OnPaint.


 
Аним   (2004-07-29 22:52) [36]

Я менял по таймеру и использовал компонент TDIBFormShaper...
(для получения HRGN с исключением нужного цвета из битмапа)

мельканий не заметил...
p.s.
я предпологал, что когда у формы изменится регион, а новая картинка еще не наложится, этот момент будет заметен..
ан, нет.. ))
хотя может от загрузки ЦП это немного зависит..


 
parovoZZ ©   (2004-07-29 23:17) [37]


> но разве в паузу между изменением региона окна и выводом
> на измененный регион графики не произойдет мелькания?..
>
> Или просто при изменении региона...
> Тут никакая буферизация не поможет...

Если отлавливать необходимые сообщения, то мельканий можно избежать, что я и сделал. Но я ненавижу VCL. Причин много, но не об этом речь.

> Огромное Кулясищще ©   (29.07.04 22:32) [35]
> >А подробнее можно? Сейчас попробую. О результатах доложу.
>
> Меняй, например, в OnPaint.

Уже сказал.


> Аним   (29.07.04 20:44) [32]
> Блиин.. а что, DelphiX тока для пятых делфей?
> Выше нет негде?

Есть, у меня для 6-ой стоит на 7-ой делфе. Но не советую использовать из-за примитивности. Я себе поставил только лишь чтобы сорцы чужие изучать.


> о результатах доложу


Докладываю: в ходе испытаний было выяснено, что действительно,  независимо как, независимо на чём, без буфера мелькания были, есть и будут. Вывод: надо делать буфер.

Но я не понял: почему же Joffa мелькает, а мой скринмэйт нет? Хотя оба они используют регионы.

//Своего скринмэйта пока не выкладываю, доделываю интерфейс и физику надо подправить.


 
Огромное Кулясищще ©   (2004-07-29 23:34) [38]

>Докладываю: в ходе испытаний было выяснено, что действительно,  независимо как, независимо на чём, без буфера мелькания были, есть и будут. Вывод: надо делать буфер.

Либо выкладывай код, либо читай начало поста Огромное Кулясищще ©   (29.07.04 20:47) [33].


 
Аним   (2004-07-30 00:16) [39]


>  независимо как, независимо на чём, без буфера мелькания
> были, есть и будут. Вывод: надо делать буфер.

Какой же буфер при работе с регионами?! Если ты о двойном, то он, понятно, нужен за тем, чтоб не было мельканий при анимации с конкретным фоном..
А тут.. ведь регион подрезает окно по границам изображения, после чего все что нужно - тупо наложить поверх свою графику..
Фон автоматически отпадает - о нем заботиться не надо..

а в буфер что загонять?! ну еси тока эту "однослойную" графику..
или не так?

p.s. код joffa не смотрел, но там точно ети регионы. Да он и всегда поверх остальных окон..
В овцах  - точно нет (не регионы).
там как раз работа с дискриптором рабочего стола (это сложнее)..
берут кусочек его перед тем как себя нарисовать.. и используют как фон..
обновляют только когда поверх их окна проходит чужое или при получении фокуса своего..
при этом обновлении жуткое мерцание: себя скрывают, берут фон и опять себя рисуют..

это я так.. )

при работе с регионами - ну ессественно мельканий (заметных) нет..
без всяких там буферов.. ))


 
MegaVolt   (2004-07-30 09:58) [40]

Вот решил выложить пример отрисовки с мерцание и без. Простенько рисую на канве. Без мерцания исспользую двойную буферизацию :) http://webfile.ru/34572



Страницы: 1 2 вся ветка

Форум: "Media";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.038 c
9-1087721018
Falcon(TFsoft)
2004-06-20 12:43
2004.10.24
DelphiX, снова detectionCollision....


3-1096366227
Koala
2004-09-28 14:10
2004.10.24
Изменение ширины колонок


1-1097353713
saNat
2004-10-10 00:28
2004.10.24
Количество символов в Memo


6-1092898751
PL
2004-08-19 10:59
2004.10.24
Еще раз о пересылке файлов


8-1091010710
СтёпКин
2004-07-28 14:31
2004.10.24
Запись в JPG при видеозахвате





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский