Форум: "Основная";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизПрозрачность Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.039 c