![]() |
Win32 API | Delphi | ФОКУС-раствориться в воздухе.
Такая проблема. Нужно сделать на winapi, чтобы окно с картинкой (или картинка) расворялось в воздухе. После того, как растворится, появляется основное окно программы. Короче, это типо заставки получается. Знаю, как написать без winapi.
Вот procedure (); var i, cavb : 0..255; begin if AlphaBlend=False then begin AlphaBlendValue:=255; AlphaBlend:=True; end; cavb:=AlphaBlendValue; for i := cavb downto 0 do begin AlphaBlendValue := i; Application.ProcessMessages; end; end; |
Насколько я знаю, такое вообще невозможно без GDI+.
Т.е. нужен windows XP. |
Достаточно Windows 2000.
Чтобы работало в windows 9x, NT4.0 и меньше, нужно ручками постараться: Корпируешь содержимое экрана в память, суммируешь с картинкой и покадрово штампуешь обратно. Чтобы работало при наличии DirectX 5 и выше, можно ручками не писать. |
ФОКУС-раствориться в воздухе.
А как насчет этого. Нельзя ли это и для winapi применить?
................ const LWA_ALPHA = $00000002; WS_EX_LAYERED = $00080000; var LayeredWndAttr:Pointer=@SetLayeredWindowAttributes; procedure TForm1.FormCreate(Sender: TObject); begin I :=50; // Устанавлевает уровнь прозрачности от 0 до 100 LayeredWndAttr := GetProcAddress(GetModuleHandle('user32.dll'),'SetLayeredWindowAttributes'); SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED); SetLayeredWindowAttributes(Handle, RGB(0, 0, 0), Round(I * 255 div 100), LWA_ALPHA); end; |
Хм, вон оно Вы как хотите...
Ну тогда (я, впрочем, могу ошибаться) есть два замечания: 1. Цвет, который станет "прозрачным", описывается у Вас RGB(0, 0, 0) - т.е. "чёрный". Остальные цвета не изменятся. Впрочем, прверить надо... 2. Всё это нужно делать не в FormCreate, а где-то ещё, потому что постоянно придётся апдейтить уже показанное окно путём вызова UpdateLayeredWindow. |
Win32 API | Delphi | ФОКУС-раствориться в воздухе.
Да, ты и не сможешь в Form.Create winapi пишешь.
Яс создал окно (Createwindow) и попробовал для него такую вещь вставить, которая выше написана. Не работает. Может кто знает почему. |
Какая винда? Которое место и какую ошибку выдаёт?
|
pva, попробуй совместить Код для создания окна (с CreateWindow) и
вот это: const LWA_ALPHA = $00000002; WS_EX_LAYERED = $00080000; var LayeredWndAttr:Pointer=@SetLayeredWindowAttributes; procedure TForm1.FormCreate(Sender: TObject); begin I :=50; // Устанавлевает уровнь прозрачности от 0 до 100 LayeredWndAttr := GetProcAddress(GetModuleHandle('user32.dll'),'SetLayeredWindowAttributes'); SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED); SetLayeredWindowAttributes(Handle, RGB(0, 0, 0), Round(I * 255 div 100), LWA_ALPHA); end; |
Сразу замечу:
1. Возможно SetWindowLong(..., GWL_EXSTYLE, ...) не сработает, т.к. не все стили можно менять после создания окна Можно попробовать врезаться в CreateWndParams. 2. Round(...) здесь лишнее (какой смысл округлять целое число?) Результаты принесу в пятницу |
Всё работает (Windows XP Prof. SP1, Delphi4, P-IV 1600),
Правда пришлось немного переписать, чтобы компилятор принял. Код:
procedure TForm1.FormCreate(Sender: TObject); |
Время: 12:33. |
Время: 12:33.
© OSzone.net 2001-