PDA

Показать полную графическую версию : Подскажите как сделать


rootKit
22-10-2004, 16:27
В NVIDIA ForceWare есть опция, благодаря которой можно совершенно любое окно в системе сделать полупрозрачным. Подскажите как это можно организовать в своей программе на Delphi.

Исправлено: rootKit, 16:33 22-10-2004

JCooper
22-10-2004, 16:47
rootKit
А разве это не на уровне GDI делается?

rootKit
22-10-2004, 17:09
Я в этом совсем чайник. Хоть строчку кода пожалуста.

Исправлено: rootKit, 17:24 22-10-2004

JCooper
23-10-2004, 14:54
rootKit
http://wasm.ru/article.php?article=1001020

rootKit
29-10-2004, 17:31
Уй ё!:o А полегче некак?

Netscaper
29-10-2004, 19:20
AlphaBlend. Только в Win2000 и более новых, в старых Windows никакого эффекта не будет. Для Delphi 5 - не помню, а в Delphi 6+:

procedure TForm1.Button1Click(Sender: TObject);
begin
 AlphaBlendValue:=128;
 AlphaBlend:=not AlphaBlend;
end;



Исправлено: Netscaper, 19:31 29-10-2004

JCooper
29-10-2004, 21:59
Netscaper
Я так понял человек хочет сделать ЛЮБОЕ окно полупрозрачным, а не окно своей программы.

Netscaper
30-10-2004, 04:14
Kuper
Возможно. Функция Windows API:

BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);

Окно hwnd должно обладать атрибутом WS_EX_LAYERED(в расширенных стилях GWL_EXSTYLE), который устанавливается при его создании или с помощью функции SetWindowLong после его создания. Указывается структура COLORREF (4-х байтный TColor в Delphi) - указывается цвет, который должен выступать в роли прозрачного, если надо, скажем, сделать неровные границы. bAlpha - уровень прозрачности 0-255, где 255 - непрозрачный,
dwFlags это:
LWA_COLORKEY - сделать прозрачным цвет
LWA_ALPHA - сделать прозрачным окно.
Вот как делает это Delphi 6 (см. исходники VCL):

procedure TCustomForm.SetLayeredAttribs;
const
 cUseAlpha: array [Boolean] of Integer = (0, LWA_ALPHA);
 cUseColorKey: array [Boolean] of Integer = (0, LWA_COLORKEY);
var
 AStyle: Integer;
begin
 if not (csDesigning in ComponentState) and
   (Assigned(SetLayeredWindowAttributes)) and HandleAllocated then
 begin
   AStyle := GetWindowLong(Handle, GWL_EXSTYLE);
   if FAlphaBlend or FTransparentColor then
   begin
     if (AStyle and WS_EX_LAYERED) = 0 then
       SetWindowLong(Handle, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
     SetLayeredWindowAttributes(Handle, FTransparentColorValue, FAlphaBlendValue,
       cUseAlpha[FAlphaBlend] or cUseColorKey[FTransparentColor]);
   end
   else
   begin
     SetWindowLong(Handle, GWL_EXSTYLE, AStyle and not WS_EX_LAYERED);
     RedrawWindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
   end;
 end;
end;

rootKit
17-12-2004, 16:17
Looks perfect... Но можно ли где небудь достать исходник, илюстрирующий данную возможность?

hasherfrog
24-12-2004, 23:26
гугль рулит не по детски (http://www.google.ru/search?q=SetLayeredWindowAttributes+examples)




© OSzone.net 2001-2012