![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачность [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]Самое, ИМХО, легкое в реализации — использование регионов и операций над ними.