Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-84953
Smithson
2002-08-15 12:22
2002.08.26
Как отобразить на taskbarе вторичные формы?


3-84888
vasilly
2002-08-02 17:36
2002.08.26
Как вывести дату без времени(21.01.2002) а не 21.01.2002 18:00:00


3-84876
SS1
2002-08-05 09:17
2002.08.26
Run Time


14-85257
Agent Smith
2002-07-31 19:49
2002.08.26
Athlon XP 1800 + Vulcan 6Cu - ЖАРА!!!


1-84965
-=Spike=-
2002-08-15 15:27
2002.08.26
Как заставить TOpenDialog запоминать последний рабочий каталог?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский