Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Исчезающий Image   Найти похожие ветки 

 
Александр1 ©   (2004-03-10 19:02) [0]

Здравствуйте уважаемые мастера! Не подскажите, как сделать так, чтобы рисунок Image или  сома Form медленно исчезала и медленно появлялась??
Заранее спасибо!


 
YuRock ©   (2004-03-10 19:27) [1]

Думаю, прийдется использовать ф-цию SetLayeredWindowAttributes, но есть 2 но:

1. Работать в 95/98 не будет;
2. TImage "погасить" неудастся - можно только окно гасить. Надо гасить окно, на котором лежит TImage.


 
Александр1 ©   (2004-03-10 19:30) [2]

YuRock Хотя-бы окно! А пимер скинуть можешь????


 
Diamond Cat ©   (2004-03-10 19:30) [3]

медленно напиваться, а потом медленно трезветь, эфект 100%

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


 
Александр1 ©   (2004-03-10 19:33) [4]

Diamond Cat Они должны постепенно становиться прозрачными!!!


 
Darrin ©   (2004-03-10 19:35) [5]

У формы есть 2 свойства:
AlphaBlend и AlphaBlendValue отвечающих за прозрачность


 
Diamond Cat ©   (2004-03-10 19:43) [6]

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

> Darrin ©  

под 98-95 AlphaBlend и AlphaBlendValue не работают


 
YuRock ©   (2004-03-10 19:46) [7]

> Александр1


type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 j: Integer;
begin
 for j := 255 downto 100 do begin
   SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
   Sleep(1);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
 SetLayeredWindowAttributes(Handle, $00FFFFFF, 255, LWA_ALPHA);
end;


 
Александр1 ©   (2004-03-10 19:51) [8]

SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
Эта строчка ошибку выдаёт!


 
YuRock ©   (2004-03-10 19:55) [9]

Какую ошибку?


 
Diamond Cat ©   (2004-03-10 19:59) [10]


> YuRock ©  

а что за процедурка такая SetLayeredWindowAttributes


 
Александр1 ©   (2004-03-10 20:02) [11]

YuRock Не всё нормально!!!! Просто этот алгоритм работает только по D7, под D5 не работает!
YuRock - Огромное тебе спасибо!
А в абратную сторону не знаешь как?


 
Diamond Cat ©   (2004-03-10 20:07) [12]

посмотрел в msdn там пишут что, Minimum operating systems Windows 2000 , так что метод не универсален


 
YuRock ©   (2004-03-10 20:08) [13]

> Александр1 ©   (10.03.04 20:02) [11]
Думаю, так:

for j := 100 to 255 do begin
 SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
 Sleep(1);
end;


 
YuRock ©   (2004-03-10 20:10) [14]

> Diamond Cat

см. YuRock [1], пункт 1


 
Александр1 ©   (2004-03-10 20:16) [15]

YuRock - я тоже так подумал! И сделал так!
Но назад то оно не работает!
Ну хоть в перёд и то хлеб!

procedure TForm1.Button1Click(Sender: TObject);
var
j: Integer;
begin
for j := 100 downto 255 do begin
  SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
  Sleep(1);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, $00FFFFFF, 100, LWA_ALPHA);
end;


 
Александр1 ©   (2004-03-10 20:19) [16]

Diamond Cat - в смысле не универсален, чё только под WinNT, 2000 XP сгодится???


 
YuRock ©   (2004-03-10 20:25) [17]

> Александр1

> я тоже так подумал! И сделал так!

Надо было не поменять местами 100 и 255 а добавить еще один цикл! Т.е.

for j := 255 downto 100 do begin
 SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
 Sleep(1);
end;

заменить на

for j := 255 downto 100 do begin
 SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
 Sleep(1);
end;
for j := 100 to 255 do begin
 SetLayeredWindowAttributes(Handle, $00FFFFFF, j, LWA_ALPHA);
 Sleep(1);
end;


> в смысле не универсален, чё только под WinNT, 2000 XP сгодится?

Не только. А только для 2k/XP/03. В предыдущих версиях Windows ф-ции SetLayeredWindowAttributes не было.


 
Diamond Cat ©   (2004-03-10 20:26) [18]

Win nt тоже не сработает только 2000 и выше


 
Александр1 ©   (2004-03-10 20:38) [19]

YuRock - Ну да точно! И чё я с начало прогнал?
YuRock - Спасибо ещё раз!
Жаль, что под win 9x не работает.
А других каких нибуть методов не кто не знает, чтобы под win 9x работало???

И чё Microsoft так поздно догадался изобрести SetLayeredWindowAttributes?


 
Diamond Cat ©   (2004-03-10 20:44) [20]


> Александр1 ©   (10.03.04 20:38) [19]

я описал выше способ, причем я уже проходил это, и все работало под любыми виндами


 
Александр1 ©   (2004-03-10 20:52) [21]

Diamond Cat - Я вообще-то ещё можно так сказать не очень класный программист. Скорее начинающий. Поэтому плохо ещё во всём этом разбираюсь!
Diamond Cat -Напиши пожалуйста пример если можно или если есть готовый скинь на мыло!


 
Александр1 ©   (2004-03-10 21:02) [22]

Ну так чё ни у кого нет примера, "на все случаи жизни" (под win 9x? NT)????????????????


 
YuRock ©   (2004-03-10 21:10) [23]

А зачем понадобились 9х? Если это коммерческая программа - то никто и не заметит, что она будет работать не так красиво, как хотел программист. Если "для себя" - вообще не вижу проблемы...


 
Mihey ©   (2004-03-10 23:26) [24]

Примеры есть, но весьма медленные.


 
Mihey ©   (2004-03-11 00:49) [25]

В общем, решил тут для общего развития написать. Проблем никаких не было. В общем, задача полупрозрачных окон в Win 9х вполне разрешима. Вот код, там откомпилированный пример, кто хочет - качайте (322 Кб, RAR):

http://www.hot.ee/mvps16/alphaappear.rar

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


 
Александр1 ©   (2004-03-11 05:25) [26]

YuRock -Ну как зачём надо чтобы программа была универсальная.


 
Александр1 ©   (2004-03-11 06:12) [27]

Mihey - Вроде пример ничего! Но действительно очень быстро! И чёто он у меня не компилируется!


 
YuRock ©   (2004-03-11 10:52) [28]

> Александр1 ©   (11.03.04 05:25) [26]

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


 
Александр1 ©   (2004-03-11 11:15) [29]

YuRock - Ну в принципи ты прав!
Ну а всётаки может есть у кого код как заставить работать визуальные эффекты на древних компах???


 
Mihey ©   (2004-03-11 15:05) [30]

>И чёто он у меня не компилируется!

Какая Delphi у тебя?

>Ну а всётаки может есть у кого код как заставить работать визуальные эффекты на древних компах???

Я те дал код. Хоть у тебя не компилит, принцип то взять ты можешь? Процедура блендинга есть, как экран копировать - есть, что ещё надо?


 
Mihey ©   (2004-03-11 20:06) [31]

Похоже из-за разницы версий Delphi не компилируется asm код.


 
Александр1 ©   (2004-03-12 12:22) [32]

А ещё кто-нибуть знает какойнибудь способ разрешения этого вопроса????


 
Александр1 ©   (2004-03-14 05:32) [33]

Да кажется больше ни кто не знает!


 
Mihey ©   (2004-03-14 14:16) [34]

>Да кажется больше ни кто не знает!

Правильно, это ж не пиво открывать - открывашкой, ножом, ключом, об острый угол, зубами, проволокой....



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

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
1-1085037983
MegaVolt
2004-05-20 11:26
2004.05.30
Как правильно обработать ошибку внутри класса?


4-1081970521
AndersoNRules
2004-04-14 23:22
2004.05.30
TerminateProcess(hProcess:Cardianl,uExitCode:Cardinal) ...


1-1084667934
IrBisoff
2004-05-16 04:38
2004.05.30
OwnerDraw TLabel


14-1084529163
Dimman
2004-05-14 14:06
2004.05.30
Простой ворос


1-1084773824
1008
2004-05-17 10:03
2004.05.30
Корректно ли следующее объявление?