zexel | Дата: Четверг, 2006-11-09, 2:56 PM | Сообщение # 1 |
Admin
Группа: Администраторы
Сообщений: 41
Статус: Offline
| ля создания прозрачного окна Вам понадобится: Форма - 1 штука, Время - 5 минут, Желание - неимоверное. Если всё это у Вас в наличии имеется, то можете смело приступать к выполнению следующих действий: Первым делом в защищённых объявлениях (после слова protected) объявим две процедуры. Изначально это слово отсутствует, поэтому Вам придётся самим вписать его (можно до слова public): protected procedure RebuildWindowRgn; procedure Resize; override; Затем в публичных объявлениях (теперь уже в public)размещаем объявление конструктора. Нам его нужно переопределить, поэтому добавляем ключевое слово override: constructor Create(AOwner:TComponent);override; В области реализации (после слова implementation) описываем конструктор так: implementation {$R *.DFM} constructor TForm1.Create(AOwner:TComponent); begin inherited; HorzScrollbar.Visible:=false; VertScrollbar.Visible:=false; RebuildWindowRgn; end; Ресурс формы {$R *.DFM} оставляем без изменений. Слово inherited свидетельствует о том, что используется стандартный обработчик этой процедуры. Мы лишь убрали полосы прокрутки HorzScrollbar.Visible:=false; VertScrollbar.Visible:=false; (скролбары), чтобы они не мешались. И построили регион с помощью процедуры RebuildWindowRgn. Тело переобъявленной процедуры Resize выглядит так: procedure TForm1.Resize; begin inherited; RebuildWindowRgn; end; Здесь мы всего лишь перестраиваем регион, когда пользователь изменяет размер окна. И, наконец, описываем процедуру RebuildWindowRgn: 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); Rgn:=CreateRectRgn(ClientX,ClientY,ClientX+ClientWidth,ClientY+ClientHeight); CombineRgn(FullRgn,FullRgn,Rgn,RGN_DIFF); 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; Как это сделано? В переменные ClientX и ClientY мы помещаем относительные координаты клиентской части. Создаём регион для всей формы: 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);
|
|
| |