![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачные окна [D6, Win95/98, Win2k]
Darlok © (2002-05-15 15:57:00)Привет всем!
Подскажите плиз, как работать с прозрачными окнами.
Если можно, то помогите примерами :)
DKuznets (2002-07-31 23:03:00) [1]Народ, вот походу другой вопрос... У меня форма не таскается, она просто прозрачная, просто Brush.Style:=bsClear... Но вот на ней метки стоят и постоянно текст меняется... Так вот новый текст появляется поверх старого - т.е. становится нечитаемым. Если убрать bsClear - то все нормально. Есть одна тонкость -
ExtendedStyle:=GetWindowLong(application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
В результате десктоп просто "просвечивает" через форму и она не мешает работе :)
Как это победить?
Proton (2002-07-31 21:49:00) [2]
>SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
>SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED);
один про фому, другой про ерему
вообще то SetWindowLong в приведенном вами виде не корректно
надо сначало
oldlong := GetWindowLong(Handle, GWL_EXSTYLE);
а затем
SetWindowLong(Handle, GWL_EXSTYLE, oldlong or WS_EX_LAYERED);
> Прозрачные окна [D6, Win95/98, Win2k]
а кокой смысл в таком окне ?
если на нем скажем нарисован рабочий стол а при нажатии ни чего не происходит ?
запугать юзера и помочь ему принять верное решение о удалении вашей программы ?
K.o.Z (2002-07-31 18:22:00) [3]читай про регионы в Win32.hlp, а ими уж можно такое творить...
REaliSt (2002-06-24 17:36:00) [4]В Дельфи 6 есть свойство AlphaBlending у TForm.
Только вот под 2000/XP onlyработает.
p^Zmei (2002-06-24 14:16:00) [5]Насчет SetLayeredWindowAttributes и WS_EX_LAYERED:
действительно присутствует в юзер32.длл, но ...
для винды2000 и ХР. В Вин9хтакой нету 8((.
Поетому просто сдерай так:
public
procedure onMoveWindow(var Msg : TWMMove);message WM_MOVE;
//или TWMWINDOWPOSCHANGED и WM_WINDOWPOSCHANGED
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
Form1.Brush.Style:=bsClear;
end;
procedure TForm1.onMoveWindow(var Msg : TWMMove);
begin
inherited;
Invalidate;
//или RedrawWindow(Form1.Handle,RDW_DRAWFRAME+RDW_UPDATENOW);
end;
После перетаскивания окошко опять станет невидимым.
(Кроме неклиентской части - она будет глюковать, потому шта
перекрашивается на WM_NCPAINT).
Наибестейших Вам регардсов.
GL (2002-05-17 16:39:00) [6]Во-первых
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED);
Во-вторых надо вызвать процедуру
SetLayeredWindowAttributes(Handle, nil, nAlpha, LWA_ALPHA);
На всякий случай
WS_EX_LAYERED = $00080000
LWA_ALPHA = 2
Ещё небольшая проблема: эта процедура не определена в Windows.pas, но её можно явно загрузить из User32.dll
Darlok (2002-05-16 12:44:00) [7]А как быть с тем, что когда его перетаскиваеш, оно таскает с собой кусок Decktop - а :(.
Могу привести код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
end;
end.
Song (2002-05-15 16:48:00) [8]Так же как и с обычными.. :)