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

Вниз

Форма приложения   Найти похожие ветки 

 
Staratel ©   (2002-08-16 09:49) [0]

Можно ли сделать прозрачность формы в Win98,Me,
AlphaBlend работает только начиная с Win2000.
Если можно, то как?


 
LENIN INC   (2002-08-16 09:52) [1]

Можно. Разбирайся:

Первым делом в защищённых объявлениях (после слова 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);


 
Ученик ©   (2002-08-16 10:17) [2]

http://www.delphikingdom.com/treasury/samples.htm#link10


 
LENIN INC   (2002-08-16 10:25) [3]

2Ученик © (16.08.02 10:17)

Хороший пример, но работает это очень и очень медленно!


 
Ученик ©   (2002-08-16 10:37) [4]

>LENIN INC (16.08.02 09:52)
Это не аналог AlphaBlend


 
LENIN INC   (2002-08-16 10:45) [5]


> Ученик © (16.08.02 10:37)


Я не смотрел сырцы, загрузил .EXE файл.
Но вот если честно, ты бы пользовался такой программой?
Я бы нет, чтобы она не делала!


 
Ученик ©   (2002-08-16 11:05) [6]

>LENIN INC (16.08.02 10:45)
Если честно, то не пользовался и остановился бы на AlphaBlend, но если бы очень понадобилось, взял бы его (или другое) за основу и попробовал бы оптимизировать.


 
LENIN INC   (2002-08-16 11:08) [7]


> Staratel © (16.08.02 09:49)


Прости, что затеял диалог в твоём разделе. Хотелось узнать чужое мнение по этому поводу. Больше такой ..... не будет!



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
7-85264
МИФИст
2002-06-13 21:15
2002.08.26
TreeView


7-85273
Transnet.
2002-06-13 04:50
2002.08.26
Как можно


1-85099
Kotka
2002-08-14 23:45
2002.08.26
Архиваторы


1-85095
ЮРИЙ_К
2002-08-13 17:06
2002.08.26
Необычное сравнение даты на вход в диапазон


3-84914
saa
2002-08-06 22:11
2002.08.26
Порядок обработки событий