Jak utworzyć przezroczystą formę

0

Próbuję utworzyć całkowicie przezroczystą formę, po której można rysować.
Jak daję

Form.AlphaBlendValue := 0;
Form.AlphaBlend := True;

lub

Form.Color := clFuchsia;
Form.TransparentColorValue := MeasureForm.Color;
Form.TransparentColor := True;

to forma jest niewidoczna, ale nie można po niej rysować, bo program zachowuje się jakby jej nie było - klikam na okna pod spodem (pewnie to samo co Form.Visible = False)

1

nie możesz mieć formy przeźroczystej i nieprzeźroczystych elementów na niej. Albo rybki albo akwarium.

0

Widziałem jakieś sposoby aby zrobić coś podobnego używając przezroczystych plików PNG. Ale jak dodatkowo po nich rysować?
Chyba że zaproponujecie inne rozwiązanie?

Ja tylko chcę narysować linię między dwoma punktami.
Forma nie musi być całkowicie niewidoczna. Może mieć leki kolor. Ale ta linia, którą rysuję, musi być widoczna całkowicie.

0

Możesz mieć za to formę o nieregularnym kształcie – poczytaj o regionach.

Też widziałem niejedno okienko z półprzezroczystą grafiką, którego krawędzie wykorzystywały ową półprzezroczystość połączoną z antialiasingiem, ale to się robi zupełnie inaczej. Formularz w całości jest widoczny i nieprzezroczysty, a podczas renderowania jego zawartości wykorzystuje się obraz okien pod spodem, pozyskany w metodzie obsługi komunikatu WM_ERASEBKGND.

System też korzysta z podobnego mechanizmu do renderowania okien w całości półprzezroczystych.

0
My Razem napisał(a):

Próbuję utworzyć całkowicie przezroczystą formę, po której można rysować.

Dlaczego chcesz rysować po czymś, czego nie widać?

0

Zawsze możesz pobrać DC pulpitu i bezpośrednio na nim malować. ;)

1

Spójrzcie na to:
https://3n.com.pl/puzzle/testTransparent.exe
https://3n.com.pl/puzzle/testTransparent.cpp
Niestety w WinApi i w C, ale pewno da się przerobić.
Generalnie technika polega na wykorzystaniu dwóch okien ze stylem WS_EX_LAYERED nałożonych na siebie.
Okno pod spodem ma zadaną przeźroczystość za pomocą LWA_ALPHA.
Okno na wierzchu - ma przeźroczystość zadaną za pomocą LWA_COLOR.
Muszą być dwa okna, bo okno z LWA_COLOR w miejscu, w którym jest przejrzyste nie odbiera komunikatów z myszki.
Okno pod spodem odbiera komunikaty i w pamięci rysuje po bitmapie, po czym odświeża okno na wierzchu. Okno na wierzchu nie robi nic tylko wyświetla bitmapę.
Trzecie okno jest tylko belką tytułową i trzyma dwa opisane wyżej.

(Funkcji SetLayeredWindowAttributes nie ma w moim środowisku i musiałem ją dociągnąć z systemu).

1 użytkowników online, w tym zalogowanych: 0, gości: 1