Első lépésként, a TBitmap osztály segítségével megnyitjuk a lemezen található BMP állományt, amely mintájára el szeretnénk készíteni a Form-ot.
Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+'Hatter.bmp');
Meg kell határoznunk azt a területet, amelyre az operációs rendszer rajzolhat. Ezt a területet az FRegion változóban hozzuk létre, a CreateRegion metódus segítségével.
procedure CreateRegion(Bitmap: TBitmap);
A CreateRectRGN függvénnyel, az adott Form-ból létrehozunk egy területet, a bitmap méretének megfelelően.
FRegion:=CreateRectRGN(0,0,Bitmap.Width,Bitmap.Height);
A függvénynek egy téglalap bal felső, és jobb alsó koordinátáit kell megadnunk.
A képet felépítő pixelek színeit meg kell vizsgálnunk, hogy az adott képpontról el tudjuk dönteni, hogy átlátszó lesz-e. A vizsgálathoz a TRGBTriple típust használjuk, amely tartalmazza az RGB három színkomponensét.
TransparentColor.rgbtRed:=255;
TransparentColor.rgbtGreen:=255;
TransparentColor.rgbtBlue:=255;
A képet soronként dolgozzuk fel. Egy adott sort a Scanline metódus meghívásával olvashatunk be.
A képpontok feldolgozása során, az átlátszó pontokból készítünk egy újabb területet, majd vesszük az FRegion tartalmának és az új területnek a különbségét, azaz a Form-ból kivágjuk az átlátszó részeket.
r:=CreateRectRGN(StartX,y,x+1,y+1);
CombineRGN(FRegion,FRegion,r,RGN_DIFF);

CombineRgn
function CombineRgn(
p1,
p2,
p3: HRGN;
p4: Integer
): Integer;
Két terület tartalmával végez különböző halmaz műveleteket.
Paraméterek
p1
Az itt megadott terület lesz az, amelybe a művelet eredménye kerül.
p2
A művelet első eleme.
p3: HRGN
A művelet második eleme.
p4: Integer
A végzendő művelet.
| Művelet |
Hatása |
| RGN_AND |
A két terület metszetét képezi. |
| RGN_COPY |
A p2 paraméterben megadott terület tartalmát átmásolja p1-be. |
| RGN_DIFF |
Az olyan részeket veszi, amely része p2-nek, de nem része p3-nak. |
| RGN_OR |
A két terület únióját képezi. |
| RGN_XOR |
A két terület únióját képezi, de kivágja belőle azokat a részeket, ahol átfedés van. |
Visszatérési érték
| Érték |
Jelentése |
| NULLREGION |
Üres terület. |
| SIMPLEREGION |
Egyszerű, téglalappal határolt terület. |
| COMPLEXREGION |
Téglalaptól eltérő, összetett terület. |
| ERROR |
Nem jött létre terület. |
Miután a bitmap képet képpontonként átvizsgáltuk, és létrehoztuk az FRegion változó által azonosított ablakterületet, nincs más hátra, minthogy a Form területét korlátozzuk.
SetWindowRGN(Handle,FRegion,True);
A megadott képet a Form OnPaint eseményében ráfestjük a Form-ra. A képet egy Image komponens segítségével olvassuk be. Készítünk egy függvényt, amely az Image komponensben elhelyezkedő képet ráfesti a Form-ra úgy, hogy közben a kép bármely szintét átlátszóvá tehetjük.
procedure TransparentBlt(dest: HDC; destx, desty, w, h: Integer; src: HDC; srcx, srcy: Integer; TransparentColor: TColor);
A Hatter.bmp cseréjével tetszőleges alakú és formájú Form hozható létre.