Witam, przedstawiam sposób, w jaki można otrzymać okno dowolnego kształtu oraz jak (w przypadku gdy oknem jest forma) przenosić je.

Opis algorytmu.

Procedura przyjmuje trzy argumenty:
Mask – piksele o tym kolorze traktowane są jako przezroczyste,
Bmp – bitmapa, której kształt ma przybrać okno,
hwnd – uchwyt okna, którego kształt ma zostać zmieniony.

1. Definiujemy dwa regiony, pierwszy określa wyodrębnione pola z danej części obrazka, a drugi całe dotychczas określone pole

2. Sprawdzamy każdy piksel wczytanego obrazka-jeżeli natkniemy się na taki, który jest różny od maski (3) i jeżeli już wcześniej takiego nie znaleźliśmy, to zapamiętujemy jego pozycję. Jeżeli warunek nie jest spełniony, to sprawdzamy (4) czy już znaleźliśmy piksel różniący się od maski i czy aktualny piksel jest taki sam jak kolor maski lub doszliśmy do końca linii obrazka. Jeżeli wyrażenie jest prawdziwe, to tworzymy nowy region, lewy górny punkt ma współrzędne (x , i) a dolny prawy (j , i + 1), czyli tworzymy region o wysokości jednego piksela. Następnie (5) łączymy cały dotychczas wyodrębniony obszar z aktualnie utworzonym.

6. Przypisujemy określony obszar oknu, którego uchwyt przekazaliśmy w parametrze hwnd.

Możemy teraz wykorzystywać nasza procedurę do zmiany kształtów dowolnego okna, np. formy (radzę ustawić BorderStyle formy na bsNone) czy przycisku:

Efekty działania:

Forma: 

Przycisk:

Kalkulator:

Poruszanie oknem o nietypowym kształcie.

Jeżeli chcemy uzyskać najlepszy efekt zmiany kształtu formy, musimy ustawić BorderStyle na bsNone. Stracimy jednak przez to belkę tytułową, przez co nie będziemy mogli przesuwać naszego okna. Aby umożliwić zmianę położenia okna, musimy zrobić to w następujący sposób: dodaj definicje dwóch zmiennych globalnych:

Klik określa, czy wciśnięto lewy przycisk myszki a OldMousePos poprzednią pozycję myszki.

Teraz obsłuż zdarzenia OnMouseDown, Up oraz Move formy:

Autor: Iskar

Załączniki

  • zip forma
    Rozmiar pliku: 12 KB