Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прозрачность [D7, WinXP]


Calibr ©   (2006-07-26 21:43:00) 

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


antonn   (2006-07-27 20:46:00) [1]

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


Ketmar   (2006-07-27 14:48:00) [2]

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


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

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


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

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1153863154&n=18

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

procedure TCustomForm.SetLayeredAttribs;


Calibr   (2006-07-26 22:33:00) [5]

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


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

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

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


Джо   (2006-07-26 22:03:00) [7]

Основная идея:
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);


PSPF2003   (2006-07-26 22:01:00) [8]

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 21:59:00) [9]

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

CreateRectRgn
CombineRgn
SetWindowRgn


Calibr   (2006-07-26 21:55:00) [10]

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


Джо   (2006-07-26 21:47:00) [11]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо