|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Win32 API | Delphi | ФОКУС-раствориться в воздухе. |
|
Delphi - Win32 API | Delphi | ФОКУС-раствориться в воздухе.
|
Пользователь Сообщения: 74 |
Профиль | Сайт | Отправить PM | Цитировать Такая проблема. Нужно сделать на 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; |
|
------- Отправлено: 00:34, 07-11-2005 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Насколько я знаю, такое вообще невозможно без GDI+.
Т.е. нужен windows XP. |
Отправлено: 10:07, 07-11-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Достаточно Windows 2000.
Чтобы работало в windows 9x, NT4.0 и меньше, нужно ручками постараться: Корпируешь содержимое экрана в память, суммируешь с картинкой и покадрово штампуешь обратно. Чтобы работало при наличии DirectX 5 и выше, можно ручками не писать. |
Отправлено: 13:26, 07-11-2005 | #3 |
Пользователь Сообщения: 74
|
Профиль | Сайт | Отправить PM | Цитировать А как насчет этого. Нельзя ли это и для 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; |
------- Отправлено: 00:08, 08-11-2005 | #4 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Хм, вон оно Вы как хотите...
Ну тогда (я, впрочем, могу ошибаться) есть два замечания: 1. Цвет, который станет "прозрачным", описывается у Вас RGB(0, 0, 0) - т.е. "чёрный". Остальные цвета не изменятся. Впрочем, прверить надо... 2. Всё это нужно делать не в FormCreate, а где-то ещё, потому что постоянно придётся апдейтить уже показанное окно путём вызова UpdateLayeredWindow. |
|
Отправлено: 10:41, 08-11-2005 | #5 |
Пользователь Сообщения: 74
|
Профиль | Сайт | Отправить PM | Цитировать Да, ты и не сможешь в Form.Create winapi пишешь.
Яс создал окно (Createwindow) и попробовал для него такую вещь вставить, которая выше написана. Не работает. Может кто знает почему. |
------- Отправлено: 11:48, 08-11-2005 | #6 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Какая винда? Которое место и какую ошибку выдаёт?
|
Отправлено: 10:18, 14-11-2005 | #7 |
Пользователь Сообщения: 74
|
Профиль | Сайт | Отправить PM | Цитировать 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; |
------- Отправлено: 17:18, 14-11-2005 | #8 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Сразу замечу:
1. Возможно SetWindowLong(..., GWL_EXSTYLE, ...) не сработает, т.к. не все стили можно менять после создания окна Можно попробовать врезаться в CreateWndParams. 2. Round(...) здесь лишнее (какой смысл округлять целое число?) Результаты принесу в пятницу |
Отправлено: 13:24, 16-11-2005 | #9 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Всё работает (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; |
Отправлено: 08:59, 18-11-2005 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Win32 API | Нужна помошь по API функциям! | vasika_hk | Программирование и базы данных | 2 | 23-05-2006 09:51 | |
Win32 API | Дозвон | XCodeR | Программирование и базы данных | 5 | 08-04-2006 12:26 | |
Delphi - Win32 API | Delphi | Странности с Winapi Timer | Mavlyudov | Программирование и базы данных | 4 | 14-11-2005 10:10 | |
Win32 API | Игры с DeferWindowPos | pva | Программирование и базы данных | 2 | 22-03-2005 10:29 | |
Win32 API | Неизвестные функции | Savant | Программирование и базы данных | 9 | 02-03-2005 10:18 |
|