Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

Прозрачность формы   Найти похожие ветки 

 
iNBox   (2005-12-15 19:32) [0]

Нашёл у себя исходник на асме при помощи которого можно делать формы программ написанных на WinAPI прозрачными вот тот код на масме:

.data
LMA_ALPHA equ 2
WS_EX_LAYERED equ 80000h
Value    dd 0    
pSLWA  dd ?
User32  db "User32.dll",0
SLWA   db "SetLayeredWindowAttributes",0
 
.code
Transparency proc hWnd:DWORD
                   invoke GetWindowLongA,hWnd,GWL_EXSTYLE
                   or eax,WS_EX_LAYERED
                   invoke SetWindowLongA,hWnd,GWL_EXSTYLE,eax
                   invoke GetModuleHandleA,ADDR User32
                   invoke GetProcAddress,eax,ADDR SLWA
                   mov pSLWA,eax
                   push LMA_ALPHA
                   push 225
                   push 0
                   push hWnd
                   call pSLWA
                   ret
Transparency endp

Попытался переписать этот код на Delphi но он не работает а окно вместо того что бы стать прозрачным просто не отображается,вот переписанный на Delphi код:

const
LMA_ALPHA     = 2;
WS_EX_LAYERED = $80000;
Value         = 0;
User32        = "User32.dll";
SLWA          = "SetLayeredWindowAttributes";

var
pSLWA               : dword;

procedure Trans(WinHwnd:DWORD);
var
e_x:dword;
begin
 GetWindowLongA(WinHwnd,GWL_EXSTYLE or WS_EX_LAYERED);
 SetWindowLongA(WinHwnd,GWL_EXSTYLE,0);
 GetModuleHandleA(pchar(User32));
 GetProcAddress(0,pchar(SLWA));
 asm
 mov pSLWA,eax
 push LMA_ALPHA
 push 250
 push 0
 push hWnd
 call pSLWA
 ret
end;
end;


Уважаемые мастера помогите разобраться в чём ошибка.


 
begin...end ©   (2005-12-15 19:45) [1]

> invoke GetWindowLongA,hWnd,GWL_EXSTYLE
> or eax,WS_EX_LAYERED
> invoke SetWindowLongA,hWnd,GWL_EXSTYLE,eax
> invoke GetModuleHandleA,ADDR User32
> invoke GetProcAddress,eax,ADDR SLWA

SetWindowLongA(hWnd, GWL_EXSTYLE, GetWindowLongA(hWnd, GWL_EXSTYLE) or WS_EX_LAYERED);
pSLWA := DWORD(GetProcAddress(GetModuleHandleA(User32), SLWA))

И ещё: ret в конце дельфишной ассемблерной вставки, по-моему, не нужен в данном случае. Да и непонятно, зачем эта вставка нужна -- ИМХО, проще объявить pSLWA как переменную нужного процедурного (stdcall) типа.


 
iNBox   (2005-12-15 22:09) [2]

я переписал процедуру прозрачности:

procedure Trans(WinHwnd:DWORD);
begin
SetWindowLongA(WinHwnd, GWL_EXSTYLE, GetWindowLongA(WinHwnd, GWL_EXSTYLE) or WS_EX_LAYERED);
pSLWA := DWORD(GetProcAddress(GetModuleHandleA(User32), SLWA));
asm
mov pSLWA,eax
push LMA_ALPHA
push 225
push 0
push hWnd
call pSLWA
end;
end;


Теперь приложение при использование данной процеду работает но окно программы стало невидимым



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

Форум: "WinAPI";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.012 c
11-1120545625
Gaddy
2005-07-05 10:40
2006.03.05
Form1.Button1Click - ошибка?


2-1139640073
Интересующийся
2006-02-11 09:41
2006.03.05
Обработка сервером формы пришедшей от клиента


2-1139896114
Emik
2006-02-14 08:48
2006.03.05
Таблици InterBase


15-1139579838
tradakad
2006-02-10 16:57
2006.03.05
компиляция проекта без использования IDE


2-1140011423
Ice
2006-02-15 16:50
2006.03.05
Виртуальный TCanvas и его фоновый цвет...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский