Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Win32 API | Delphi | ФОКУС-раствориться в воздухе. (http://forum.oszone.net/showthread.php?t=56226)

Mavlyudov 07-11-2005 00:34 370912

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;

hasherfrog 07-11-2005 10:07 370978

Насколько я знаю, такое вообще невозможно без GDI+.
Т.е. нужен windows XP.

pva 07-11-2005 13:26 371078

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

Mavlyudov 08-11-2005 00:08 371333

ФОКУС-раствориться в воздухе.
 
А как насчет этого. Нельзя ли это и для 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 371452

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

Mavlyudov 08-11-2005 11:48 371471

Win32 API | Delphi | ФОКУС-раствориться в воздухе.
 
Да, ты и не сможешь в Form.Create winapi пишешь.
Яс создал окно (Createwindow) и попробовал для него такую вещь вставить, которая выше написана. Не работает. Может кто знает почему.

pva 14-11-2005 10:18 373676

Какая винда? Которое место и какую ошибку выдаёт?

Mavlyudov 14-11-2005 17:18 373838

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 374485

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

pva 18-11-2005 08:59 375147

Всё работает (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;



Время: 12:33.

Время: 12:33.
© OSzone.net 2001-