Delphi - Form megjelenítése bitmap alapján

forráskód letöltése
Ebben a példában annak járunk utána, hogy miként lehet egy Form-ot megjeleníteni, egy BMP állományból betöltött kép alapján. Ahol a kép fehér színeket tartalmaz, ott a Form-ot átlátszóvá tesszük, majd a képet ráfestjük a Form-ra.
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.