Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

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

 
pumba   (2003-05-23 17:47) [0]

Хотел бы у вас спросить, есть ли в делфи такое понятие, как "прозрачность окна". Как с ним работать?


 
Петров Денис ©   (2003-05-23 18:06) [1]

Есть. Свойство AlphaBlend называется. Если установлено в True, то параметр AlphaBlendValue устанавливает степень прозрачности формы (от 255 - непрозрачная до 0 - невидимая).


 
Opuhshii ©   (2003-05-23 18:34) [2]

2pumba (23.05.03 17:47)
сие (Свойство AlphaBlend) применимо для Delphi >=6
для версий Delphi меньше 6-й используют функцию из User32

BOOL SetLayeredWindowAttributes (
HWND hwnd, // хэндл нужного окна
COLORREF crKey, // Цвет прозрачности
BYTE bAlpha, // Собственно прозрачность
DWORD dwFlags // флаги
);

Флаги:
LWA_COLORKEY = 1 // использовать цвет прозрачности
LWA_ALPHA = 2 // использовать значение альфы

для того чтоб окно подждерживало прозрачность необходимо установить расширеный стиль окна WS_EX_LAYERED с помощью SetWindowLong. т.е индекс GWL_EXSTYLE и NewLong соответственно то что было и WS_EX_LAYERED.

все радости с прозрачными окнома начинаются с NT5
по-русски W2k и выше.


 
Юрий Зотов ©   (2003-05-23 21:17) [3]

Из MSDN по поводу SetLayeredWindowAttributes:

Requirements
Windows NT/2000 or later: Requires Windows 2000 or later.
Windows 95/98/Me: Unsupported.

====================

На Королевстве лежит бесплатная (и с исходниками) библиотека компонентов FormRgn Антона Григорьева. Там и прозрачность (для всех Delphi и всех Windows), и еще многое другое.


 
AbrosimovA   (2003-05-29 14:05) [4]

Вот полный код для установки эффекта прозрачности/непрозрачности формы по нажатию кнопки. Работает и в Windows 98.

unit TransForm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls, FreeButton;

type
TForm = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormActivate(Sender: TObject);

private
{ Private declarations }
public
procedure DoVisible;
procedure DoInvisible;
{ Public declarations }
end;

var
Form: TForm;
FullRgn, ClientRgn, CtlRgn : THandle;
TextRgn : HRGN;
LeftPos : integer;
TopPos : integer;
function Trans():boolean;
procedure FormCreate;

implementation

uses About;

{$R *.DFM}

procedure FormCreate;
begin
Form.Canvas.Font.Name := "Times New Roman";
Form.Canvas.Font.Size := 48;
Form.Canvas.Font.Style := Form.Canvas.Font.Style + [fsBold];
Form.Canvas.Font.Color := clBlue;
Form.Canvas.Brush.Style := bsClear;
LeftPos := (Form.Width - Form.Canvas.TextWidth
("Прозрачность")) Div 2 - 10;
TopPos := Form.Height - 40 - Form.Canvas.TextHeight
("Прозрачность");
Form.Show;
end;

function Trans():boolean;
begin
Form := TForm.Create(Application);
FormCreate;
end;

procedure TForm.DoInvisible;
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
bt : TBitmap; // bmp for "text" region
cap, bord : integer;
begin
Margin := ( Width - ClientWidth ) div 2;
cap := GetSystemMetrics(SM_CYCAPTION); // Размер заголовка
bord := GetSystemMetrics(SM_CYSIZEFRAME); // Размер бордюра
// Установка bitmap для текста
bt := TBitmap.Create;
bt.Width := Form.Width;
bt.Height := Form.Height;
bt.Canvas.Font := Form.Canvas.Font;
BeginPath(bt.Canvas.Handle);
SetBkMode(bt.Canvas.Handle,TRANSPARENT);
bt.Canvas.TextOut(LeftPos + Margin,TopPos + cap
+ bord,"Прозрачность");
EndPath(bt.Canvas.Handle);
TextRgn := PathToRegion(bt.Canvas.Handle);

//Сначала получаем регион формы
FullRgn := CreateRectRgn(0, 0, Width, Height);
//Ищем регион клиентской области
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y
+ ClientHeight );
//Окончательный "трафарет" для всей неклиентской области
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );

//Теперь проходим через все контролы формы и получаем полный
регион.
for A := 0 to ControlCount - 1 do begin
AControl := Controls[A];
if ( AControl is TWinControl ) or ( AControl is
TGraphicControl )
then with AControl do begin
if Visible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY
+ Height );
CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );
end;
end;
end;
// Add the text and free the bmp
CombineRgn( FullRgn, FullRgn, TextRgn, RGN_OR );
bt.Free;
//When the region is all ready, put it into effect:
SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TForm.FormClose(Sender: TObject);
begin
//Очищаем все созданные регионы
DeleteObject(ClientRgn);
DeleteObject(FullRgn);
DeleteObject(CtlRgn);
DeleteObject(TextRgn);
end;

procedure TForm.DoVisible;
begin
//Восстановление непрозрачности:
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TForm.FormPaint(Sender: TObject);
begin
Form.Canvas.TextOut(LeftPos,TopPos,"Прозрачность");
end;

procedure TForm.Button1Click(Sender: TObject);
begin
Form.Close;
end;

procedure TForm.Button2Click(Sender: TObject);
begin
//Эта кнопка переключает между прозрачностью и непрозрачностью
//формы
if Button2.Caption = "Show Form" then begin
DoVisible;
Button2.Caption := "Hide Form";
Form.Caption:= "Непрозрачная форма";
end
else begin
DoInvisible;
Button2.Caption := "Show Form";
Form.Caption:= "Прозрачная форма";
end;
end;

procedure TForm.FormResize(Sender: TObject);
begin
//Сохранение свойств прозрачности формы при изменении ее размера
if Button2.Caption = "Show Form" then
DoInvisible
else
DoVisible;
end;

procedure TForm.FormActivate(Sender: TObject);
begin
SetFocus;
end;

end.



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

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
6-26632
denisWW
2003-04-07 22:26
2003.06.09
ну кто посоветует?TNMFTP вызывает NMFTP1PacketSent только кратно


1-26477
.::D.e.M.o.N.i.X::.
2003-05-29 14:12
2003.06.09
Вопрос по ListView


3-26349
AlexAvz
2003-05-20 13:43
2003.06.09
Перенос БД на другой компьютер


8-26620
Terminus
2003-02-25 01:49
2003.06.09
Два вопроса


3-26339
Jaxtor
2003-05-20 11:12
2003.06.09
DBComboBox