Войти

Показать полную графическую версию : Win32 API | Delphi | ФОКУС-раствориться в воздухе.


Mavlyudov
07-11-2005, 00:34
Такая проблема. Нужно сделать на 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;

hasherfrog
07-11-2005, 10:07
Насколько я знаю, такое вообще невозможно без GDI+.
Т.е. нужен windows XP.

pva
07-11-2005, 13:26
Достаточно Windows 2000.
Чтобы работало в windows 9x, NT4.0 и меньше, нужно ручками постараться:
Корпируешь содержимое экрана в память, суммируешь с картинкой и покадрово штампуешь обратно.
Чтобы работало при наличии DirectX 5 и выше, можно ручками не писать.

Mavlyudov
08-11-2005, 00:08
А как насчет этого. Нельзя ли это и для 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;

hasherfrog
08-11-2005, 10:41
Хм, вон оно Вы как хотите...
Ну тогда (я, впрочем, могу ошибаться) есть два замечания:
1. Цвет, который станет "прозрачным", описывается у Вас RGB(0, 0, 0) - т.е. "чёрный". Остальные цвета не изменятся. Впрочем, прверить надо...
2. Всё это нужно делать не в FormCreate, а где-то ещё, потому что постоянно придётся апдейтить уже показанное окно путём вызова UpdateLayeredWindow.

Mavlyudov
08-11-2005, 11:48
Да, ты и не сможешь в Form.Create winapi пишешь.
Яс создал окно (Createwindow) и попробовал для него такую вещь вставить, которая выше написана. Не работает. Может кто знает почему.

pva
14-11-2005, 10:18
Какая винда? Которое место и какую ошибку выдаёт?

Mavlyudov
14-11-2005, 17:18
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;

pva
16-11-2005, 13:24
Сразу замечу:
1. Возможно SetWindowLong(..., GWL_EXSTYLE, ...) не сработает, т.к. не все стили можно менять после создания окна
Можно попробовать врезаться в CreateWndParams.
2. Round(...) здесь лишнее (какой смысл округлять целое число?)
Результаты принесу в пятницу

pva
18-11-2005, 08:59
Всё работает (Windows XP Prof. SP1, Delphi4, P-IV 1600),
Правда пришлось немного переписать, чтобы компилятор принял.

procedure TForm1.FormCreate(Sender: TObject);
type
TLayeredWndAttr = function(hwnd:integer; color:integer; level:integer; mode:integer): Integer; stdcall;
const
LWA_ALPHA = $2;
WS_EX_LAYERED = $80000;
var
LayeredWndAttr: TLayeredWndAttr;
i : integer;
begin
i := 50;
LayeredWndAttr := GetProcAddress(GetModuleHandle('user32.dll'),
'SetLayeredWindowAttributes');

SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED);
LayeredWndAttr(HANDLE, RGB(0,0,0), i*255 div 100, LWA_ALPHA);
end;




© OSzone.net 2001-2012