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

Вниз

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

 
Calibr ©   (2006-07-26 21:43) [0]

Как сделать чтоб форма была прозрачной, а какой нибудь компонент на ней типа TWinControl был не прозрачным?


 
Джо ©   (2006-07-26 21:47) [1]

Самое, ИМХО, легкое в реализации — использование регионов и операций над ними.


 
Calibr ©   (2006-07-26 21:55) [2]

А по подробнее???


 
Джо ©   (2006-07-26 21:59) [3]

> [2] Calibr ©   (26.07.06 21:55)
> А по подробнее???

CreateRectRgn
CombineRgn
SetWindowRgn


 
PSPF2003 ©   (2006-07-26 22:01) [4]

unit unit1;
interface
uses    Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, jpeg, Buttons, XPMan;
type
 TForm1 = class(TForm)
   SpeedButton1: TSpeedButton;
   XPManifest1: TXPManifest;
   procedure SpeedButton1Click(Sender: TObject);
   // это просто кнопка на форме - для демонстрации
 protected
   procedure RebuildWindowRgn;
   procedure Resize; override;
 public
   constructor Create(AOwner: TComponent); override;
 end;
var
 Form1 : TForm1;
implementation
// ресурс этой формы
{$R *.DFM}

{ Прозрачная форма }
constructor TForm1.Create(AOwner: TComponent);
begin
 inherited;
 // убираем сколлбары, чтобы не мешались
 // при изменении размеров формы
 HorzScrollBar.Visible:= False;
 VertScrollBar.Visible:= False;
 // строим новый регион
 RebuildWindowRgn;
end;

procedure TForm1.Resize;
begin
 inherited;
 // строим новый регион
 RebuildWindowRgn;
end;

procedure TForm1.RebuildWindowRgn;
var
 FullRgn, Rgn: THandle;
 ClientX, ClientY, I: Integer;
begin
 // определяем относительные координаты клиенской части
 ClientX:= (Width - ClientWidth) div 2;
 ClientY:= Height - ClientHeight - ClientX;
 // создаем регион для всей формы
 FullRgn:= CreateRectRgn(0, 0, Width, Height);
 // создаем регион для клиентской части формы
 // и вычитаем его из FullRgn
 Rgn:= CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth,
ClientY + ClientHeight);
 CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);
 // теперь добавляем к FullRgn регионы каждого контрольного элемента
 for I:= 0 to ControlCount -1 do
   with Controls[I] do begin
     Rgn:= CreateRectRgn(ClientX + Left, ClientY + Top, ClientX +
Left + Width, ClientY + Top + Height);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
   end;
 // устанавливаем новый регион окна
 SetWindowRgn(Handle, FullRgn, True);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Close;
end;

end.


 
Джо ©   (2006-07-26 22:03) [5]

Основная идея:
var
 FormRgn,
 Rgn: HRGN;
...
 // создаем прямоугольный регион
 // который должен остаться видимым на форме
 Rgn := CreateRectRgn (0,0,100,100);

 // создаем регион по текущему размеру формы
 FormRgn := CreateRectRgn(0,0,Width,Height);

 // вычитаем из региона формы маленький регион
 CombineRgn(FormRgn,PanelRgn,FormRgn,RGN_AND);

 // удаляем уже ненужный регион
 DeleteObject (Rgn);

 // задаем для формы новый регион отображения
 SetWindowRgn(Handle,FormRgn,True);


 
Джо ©   (2006-07-26 22:18) [6]

> [5] Джо ©   (26.07.06 22:03)

Перемудрил я тут, можно и проще без всяких CombineRgn, а сразу "маленький" регион передавать в SetWindowRgn. Сорри, спешка и невнимательность :(


 
Calibr ©   (2006-07-26 22:33) [7]

Нет, я имею ввиду чтоб форма была не полностью прозрачной, а например ее AlphaBlendValue = 120, а компоненты не прозрачны?


 
Мефисто   (2006-07-26 23:04) [8]

http://delphimaster.net/view/2-1153863154/

судя по эксперементам изучать принцип работы SetLayeredWindowAttributes

procedure TCustomForm.SetLayeredAttribs;


 
Степан   (2006-07-27 10:21) [9]

Помоему, сделать это будет довольно таки тяжеловато... это конечно если это ВООБЩЕ ВОЗМОЖНО?


 
Ketmar ©   (2006-07-27 14:48) [10]

возможно. но нафига?


 
antonn ©   (2006-07-27 20:46) [11]

можно заюзать updatelayeredwindow()
но только заниматься перерисовкой нужно будет полностью "вручную"



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

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

Наверх




Память: 0.49 MB
Время: 0.041 c
2-1156334632
Lera
2006-08-23 16:03
2006.09.10
Динамичиские массивы


4-1147352842
Dimich1978
2006-05-11 17:07
2006.09.10
Более рациональное отслеживание Существование процесса


1-1153814246
gear
2006-07-25 11:57
2006.09.10
Динамическое создание TFrame и доступ к определёному объекту...


2-1156272009
anton773
2006-08-22 22:40
2006.09.10
Shellexecute


15-1155037865
Lexiy
2006-08-08 15:51
2006.09.10
Прием на работу