Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прозрачная область на форме [D5, WinXP]


Страницы:   1 2

Леший ©   (2005-04-23 16:30:00) 

Подскажите, как можно на форме сделать прозрачную область/области, или хотя бы "дыру" в форме, но чтобы она ловила события мыши?


Чапаев   (2005-04-26 09:55:00) [21]

> Я правильно ловлю мысль?
Ахха. WM_MOUSEMOVE перехватывай.


Леший   (2005-04-25 21:54:00) [22]

Вторая форма - это не серьезно. Есть следующее соображение: после установки новой области (см. пример) сохранять битмап дырки, устанавливать SetWindowRgn(Handle, Rgn1, True), и кидать на него сохраненный битмап. Пробую реализовать.

2 Чапаев:

Мысль интересная, но SetCapture посылает весь ввод в указанное окно. А для того чтобы передавать ввод в др. окна придется отслеживать координаты мыши и при выходе ее из области моего окна выполнять ReleaseCapture. Я правильно ловлю мысль?

И вопрос ко всем: я когда сотворял аналог примера самостоятельно использовал что-то вроде CombineRgn(Rgn1, Rgn1, Rgn2, RGN_DIFF); при этом все работало также, но при незакрепленной панели задач она отказывалась всплывать. Если сделать как в примере, то этого не наблюдается. Есть этому логическое объяснение, или это просто глюк системы?


Piter   (2005-04-25 17:15:00) [23]

Deka ©   (25.04.05 14:06) [10]
Наверное придется как в [6]...


наверное, придется передумать. Ибо что это за юзабельность - я тыкаю в пустое место, а получается, что я хватаю за форму. Что за бред? Ты где-нибудь такое видел?


Deka   (2005-04-25 14:06:00) [24]

Мда...
Наверное придется как в [6]...


alpet   (2005-04-25 13:17:00) [25]

2 Deka
Все что помещается на прозрачное окно как дочерний элемент управления - наследует его прозрачность.


Чапаев   (2005-04-25 13:10:00) [26]

SetCapture()?


Deka   (2005-04-25 12:03:00) [27]

Может быть сделать форму полностью прозрачной, а на нее поместить TImage c включенной прозрачностью и картинкой в виде прямоугольника (по размерам форму) с кругом посередине. Круг соотвественно тоже должен быть прозрачным. В результате рабочий стол ты по идее увидишь но мышка будет всегда оставаться над твоим окном. Может так? Сам не пробовал, чисто теоретическое предположение.


alpet   (2005-04-25 11:44:00) [28]

Накрой получившуюся дыру другим окном (формой) с установленной прозрачностью (opacity), и синхронизируй его позицию относительно основного окна. В Win98 есстно это работать не будет.


Леший   (2005-04-25 01:55:00) [29]

Ловить события мыши очень надо - я тягаю форму за "тело", да и некоторые другие события не мешало бы обработать.
С комбинацией регионов я работать уже пробовал, но при этом мышь через дыры падает на нижнее окно, а как с этим бороться я не знаю. (С хуками я не дружу.) Поэтому и написал в форум. Так что если у кого-то есть какие-либо конструктивные соображения/предложения - восприму с благодарностью.


Piter   (2005-04-24 22:01:00) [30]

Леший   (23.04.05 16:30)
но чтобы она ловила события мыши?


а зачем ей ловить события мыщи, если там дырка?


Ученик   (2005-04-24 21:28:00) [31]

>Юрий Зотов ©   (24.04.05 20:58) [2]

Да, действительно так

After a successful call to SetWindowRgn, the system owns the region specified by the region handle hRgn. The system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not delete this region handle. The system deletes the region handle when it no longer needed.


Юрий Зотов   (2005-04-24 20:58:00) [32]

> Ученик   (23.04.05 16:44) [1]

DeleteObject(FRgn) - это лишнее. Если посмотреть результат, он будет равен нулю - то есть, функция отработала с ошибкой и ничего не освободила.

Объясняется это тем, что после вызова SetWindowRgn владельцем региона FRgn становится не наша программа, а система и освободить его может только она сама.


Ученик   (2005-04-23 16:44:00) [33]


type
 TForm1 = class(TForm)
   procedure FormShow(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
   FRgn: HRgn;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
 Rgn1, Rgn2: HRgn;
begin
 Rgn1 := CreateRectRgn(0, 0, Width, Height);
 try
   Rgn2 := CreateRectRgn(100, 100, 200, 200);
   try
     FRgn := CreateRectRgn(0, 0, 0, 0);
     CombineRgn(FRgn, Rgn1, Rgn2, RGN_DIFF);
     SetWindowRgn(Handle, FRgn, False)
   finally
     DeleteObject(Rgn2)
   end
 finally
   DeleteObject(Rgn1)
 end
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 DeleteObject(FRgn)
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо