Delphi - Színátmenetes kitöltés, áttetszőség

GDI 2. rész

forráskód letöltése

Ebből a cikkből megtudhatjuk, hogy hogyan tudunk a Windows GDI függvények segítségével színátmenetes, valamilyen mértékben áttetsző, illetve tetszőleges formájú bitképeket létrehozni, és felhasználni. A mellékelt példaprogramban egy több színátmenetet tartalmazó áttetsző képet mozgathatunk egy háttérkép felett, miközben az egér görgőjével az áttetszőség mértékét állíthatjuk. Windows NT esetén egy színátmenetes feliratot is mozgathatunk, amely áttetsző árnyékot vet a háttérre, és az előbb említett színátmenetes képre egyaránt. Először is nézzük meg, hogy hogyan tudunk egy színátmenetes sávot rajzolni egy bitképre. A függvény a GradientFill, amellyel egy téglalap, vagy háromszög alakú színátmenetes alakzatot rajzolhatunk. A függvényt az implementációs rész előtt deklarálnunk kell:
function GradientFill(Handle: HDC; pVertex: pointer; dwNumVertex: DWORD; pMesh: pointer; dwNumMesh:
    DWORD; dwMode: DWORD): DWORD; stdcall; external 'msimg32.dll';
A függvény paraméterei a következők:
Handle: a célterület Canvas-ának azonosítója (pl. Form1.Canvas.Handle).
pVertex: egy pointer a TRIVERTEX struktúrákra. A TRIVERTEX struktúra a következőképpen néz ki:
  TRIVERTEX = packed record
    X: DWORD;
    Y: DWORD;
    Red: WORD;
    Green: WORD;
    Blue: WORD;
    Alpha: WORD;
  end;
Az X és Y a koordináták. A Red, Green és Blue az adott koordinátában lévő szín színösszetevői. Minden színösszetevőt 8 bittel balra el kell tolni, aminek a legegyszerűbb módja a 256-tal való szorzás. Az Alpha mező nincs használva.
dwNumVertex: pontok száma.
pMesh: pointer egy TGradientTriangle, vagy TGradientRect struktúrára. Az előbbi háromszög esetén használható, és 3 egész típusú mezője van, utóbbi pedig téglalap esetén használható, és csak két egész típusú mezője van. A mezőkben meg kell adni, hogy a háromszög egyes pontjait a TRIVERTEX tömb melyik eleme határozza meg, illetve téglalap esetén melyik tömb elem adja meg a téglalap bal-felső, illetve jobb-alsó sarkának adatait.
dwNumMesh: a fent említett struktúrákból mennyi van.
dwMode: ennek a paraméternek az értékét három konstanssal adhatjuk meg:
  • GRADIENT_FILL_RECT_H: téglalap esetén vízszintes színátmenet.
  • GRADIENT_FILL_RECT_V: téglalap esetén függőleges színátmenet.
  • GRADIENT_FILL_TRIANGLE: háromszög esetén kell használni.

Ha egy képrészletet úgy akarunk egy másikra másolni, hogy valamilyen mértékben áttetsző legyen, tehát az eredeti kép is látszódjon alatta, akkor ezt az AlphaBlend függvénnyel tudjuk megtenni.
Az AlphaBlend függvény paraméterei a következők:
hdcDest: a cél bitmap Canvas-ának azonosítója (Handle)
nXOriginDest: a célterület X koordinátája.
nYOriginDest: a célterület Y koordinátája.
nWidthDest: a célterület szélessége.
nHeightDest: a célterület magassága.
hdcSrc: a forrás bitkép Canvas-ának azonosítója.
nXOriginSrc: a forrásterület X koordinátája.
nYOriginSrc: a forrásterület Y koordinátája.
nWidthSrc: a forrásterület szélessége. Ha nem egyezik meg a célterület szélességével, akkor nagyítás, vagy kicsinyítés történik.
nHeightSrc: a forrásterület magassága. Ugyanaz vonatkozik rá, mint a szélességre.
blendFunction: TBlendFunction struktúra, aminek csak a SourceConstantAlpha mezője használható. Az összes többi mező értéke 0 legyen. A SourceConstantAlpha mező értéke az átlátszóság mértékét határozza meg. Értéke 0-255 lehet. Minél nagyobb az érték, annál kevésbé áttetsző a kép.

A MaskBlt függvény sajnos csak Windows NT esetén használható. Szükség van hozzá egy monochrome bitképre, ami egy maszkot tartalmaz. Ezt a maszkot használhatjuk a függvényben két kép pixeleinek kombinálásához.
A függvény paraméterei a következők:
hdcDest: a cél bitkép Canvas-ának azonosítója.
nXDest: a célterület X koordinátája.
nYDest: a célterület Y koordinátája.
nWidth: a célterület szélessége.
nHeight: a célterület magassága.
hdcSrc: a forrás bitkép Canvas-ának azonosítója.
nXSrc: a forrásterület X koordinátája.
nYSrc: a forrásterület Y koordinátája.
hbmMask: egy monochrome bitkép azonosítója (pl. FBitmap.Handle)
xMask: a maszk X koordinátája.
yMask: a maszk Y koordinátája.
dwRop: a bitképek pixelei között végzett logikai műveletek. Két logikai műveletet kell megadni, amit legegyszerűbben a MAKEROP4 függvénnyel tudunk megtenni. Az első paraméter az „előtér”-rel, míg a második a háttérrel végzett logikai művelet. A maszk képen a fehérrel megrajzolt részek adják meg azokat a pixeleket, amiket a forrásképből másolni szeretnénk a célképre. Ha azt szeretnénk, hogy ahol a maszkon fekete pixelek vannak, ott a célterület pixelei látszódjanak, akkor a következő kombinációt kell használnunk:
Rop := MAKEROP4(SRCCOPY, $00AA0029);
A második paraméter hexadecimális formában van megadva, mivel ehhez nem deklaráltak konstanst. Jelentése az, hogy a másolás során a célterület pixelei változatlanok maradnak.

A példaprogramban használtunk még két GDI függvényt, amiket szintén most ismertetünk. Mindkettő a TRect adattípussal függ össze, amit igen gyakran használunk, ha egy területet kell meghatározni.

Az OffsetRect függvénnyel X és Y irányba eltolhatjuk a területet. A függvény első paramétere a TRect struktúra, a második az X irányú eltolás, a harmadik pedig az Y irányú eltolás. Az X értéket a Left és Right, az Y-t pedig a Top és Bottom mezők értékéhez adja hozzá.

A PtInRect függvény nagyon jól jön akkor, amikor egy koordinátáról meg akarjuk állapítani, hogy az egy adott területen belül van-e. Az első paraméter egy TRect struktúra, a második pedig egy TPoint típus, amiben a koordinátát kell megadni.
var
  rect: TRect;
...
  if PtInRect(rect, Point(x,y)) then ...




GDI cikksorozat