Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.069 c
2-1156001510
RASkov
2006-08-19 19:31
2006.09.10
NToXY


3-1151948212
yon
2006-07-03 21:36
2006.09.10
450 полей в dbf


15-1155370126
Loginov Dmitry
2006-08-12 12:08
2006.09.10
Тест для всех!


15-1156072441
BOA_KAA
2006-08-20 15:14
2006.09.10
Интересный конкурс


2-1156097090
Sergioni
2006-08-20 22:04
2006.09.10
ServerSocket на определенных сетевых картах





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский