Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Вниз

Прозрачность окон 


Olgerd   (2001-09-08 01:57) [0]

Чтобы поменять прозрачность окна под Win2000, например, сделать его ПОЛупрозрачным я пишу
SetLayeredWindowAttributes(Handle, clBlack, 122,LWA_ALPHA);
А если запустить этот exe-шник под Win95, то выдаётся ошибка об отсуствующем компоненте SetLayeredWindowAttributes



AlexanderBogdanov   (2001-09-08 07:21) [1]

У win95 нет прозрачности.



Olgerd   (2001-09-09 10:37) [2]

Я понимаю, что нет, но мне надо, чтобы под Win95 хотя бы запускалась!



yar   (2001-09-09 10:58) [3]

при запуске - проверяй версию операционки
и только в 2000-ной выставляй прозрачности



phosgen   (2001-09-09 12:47) [4]

Вообще-то в вин95 можно делать прозрачные окна...
Причем не только прозрачные, но еще и любой формы.
Делается все довольно просто: при помощи функции SetWindoowRgn



phosgen   (2001-09-09 12:47) [5]

Вообще-то в вин95 можно делать прозрачные окна...
Причем не только прозрачные, но еще и любой формы.
Делается все довольно просто: при помощи функции SetWindoowRgn



phosgen   (2001-09-09 12:48) [6]

Вообще-то в вин95 можно делать прозрачные окна...
Причем не только прозрачные, но еще и любой формы.
Делается все довольно просто: при помощи функции SetWindoowRgn



MK   (2001-09-09 14:38) [7]

2 phosgen
Позволю себе заметить, что в Windows 95 полупрозрачные окна делать нельзя;
любой формы - да, а вот полупрозрачные - нет, можно установить для окна
стиль TRANSPARENT, но это очень разные вещи по сравнению с subj.
Существуют способы добиться некоторого подобия полупрозрачности, но помощи
со стороны ОС - никакой.
А что касается SetLayeredWindowAttributes, то ее нужно прицеплять с
помощью динамической линковки, вот и все.



MK   (2001-09-09 14:43) [8]

A propos, обратил пристальное внимание на subj и что я вижу: D6! Тогда
какие проблемы с установкой AlphaBlend для формы? Все отлично работает
под любой ОС.



Olgerd   (2001-09-09 17:24) [9]

Конечно, я видел более-менее успешные реализации полупрозрачных окон под Win9x, но они сильно притормаживают. Я знаю что под D6 можно поставить AlphaBlend, но это только у своей формы, а если у чужого окна?
Но объясни, пожалуйста, как "прицеплять с помощью динамической линковки".



Olgerd   (2001-09-09 17:26) [10]

Конечно, я видел более-менее успешные реализации полупрозрачных окон под Win9x, но они сильно притормаживают. Я знаю что под D6 можно поставить AlphaBlend, но это только у своей формы, а если у чужого окна?
Но объясни, пожалуйста, как "прицеплять с помощью динамической линковки".



Lamo   (2001-09-10 06:23) [11]

Не знаю, как насчёт полупрозрачности, но вот следующая программка делает окошко прозрачным...

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
procedure RebuildWindowRgn;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
HorzScrollBar.Visible:= False;
VertScrollBar.Visible:= False;
// строим новый регион
RebuildWindowRgn;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
// строим новый регион
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;
end.



savva   (2001-09-10 12:29) [12]

>Lamo
На первый взгляд форма только прозрачная, а вот если кликнуть мышОй в область ограниченную фреймом, что произойдет? это не прозрачность, это ДЫРА (если конечно так можно сказать), хорошо вырезанная.



Lamo   (2001-09-10 15:38) [13]

Нуу..впринципе да.., но если ему такая прозрачность не подходит :) извиняете.., конечно хорошо было бы что-то типа AlphaBlend, но как это сделать под Винды-9x я не знаю...



savva   (2001-09-11 10:43) [14]

в принципе наверное можно, хотя способ будет не ахти какой.
я это делал вот как: на форму кидаешь image1, делаешь ей allign = alClient и transparent = true

для формы
procedure TForm1.FormCreate(Sender: TObject);
begin
inherited;
Brush.Style:=bsClear;
end;
Все это хорошо, но форма не перерисовывается при перемещении/изменении размера. Добавив обработчик события WM_EXITSIZEMOVE можно добиться перерисовки. Я просто прятал а потом показывал форму.

procedure WMEXITSIZEMOVE(var Message: TMessage); message WM_EXITSIZEMOVE;

....

procedure TForm1.WMEXITSIZEMOVE(var Message: TMessage);
begin
ShowWindow(form1.Handle,SW_HIDE);
ShowWindow(form1.Handle,SW_SHOW);
end;

Убого, но работает :)) выходит именно визуально ПРОЗРАЧНАЯ форма. Полупрозрачная форма долго перерисовывается - видел примерчик...



Mashinist   (2001-09-28 21:43) [15]

Оно конечно, хорошо, даже если вырезать часть формы.
Но под остальными остается серое поле.
Допустим, под Image.
Как тут быть ?



dmur   (2001-09-30 21:07) [16]

посмотри здесь:
http://www.delphikingdom.com/treasury/samples.htm#link9



savva   (2001-10-02 09:26) [17]

>Mashinist
а разве Brush.Style:=bsClear; не помогает??




Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.055 c
3-52511           JEff                  2001-12-08 13:16  2002.01.17  
Что из себя представляет BDE?


3-52519           kserg@ukr.net         2001-12-17 10:48  2002.01.17  
Как отследить внесенные в БД изм-ния в др.приложениях?


1-52578           bit                   2001-12-29 09:59  2002.01.17  
ScanLine


3-52496           Шавлюк Евгений        2001-12-13 00:27  2002.01.17  
Использование ClientDataSet


1-52618           Анатолий              2002-01-01 03:57  2002.01.17  
ReportSmith