Показать полную графическую версию : Подскажите как сделать
В NVIDIA ForceWare есть опция, благодаря которой можно совершенно любое окно в системе сделать полупрозрачным. Подскажите как это можно организовать в своей программе на Delphi.
Исправлено: rootKit, 16:33 22-10-2004
rootKit
А разве это не на уровне GDI делается?
Я в этом совсем чайник. Хоть строчку кода пожалуста.
Исправлено: rootKit, 17:24 22-10-2004
rootKit
http://wasm.ru/article.php?article=1001020
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
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;
Looks perfect... Но можно ли где небудь достать исходник, илюстрирующий данную возможность?
hasherfrog
24-12-2004, 23:26
гугль рулит не по детски (http://www.google.ru/search?q=SetLayeredWindowAttributes+examples)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC