A Windows-ban ahhoz, hogy rajzolni tudjuk szükség van egy Device Contex leíróra (HDC). A Delphi-ben megszokhattuk, hogy ha rajzolunk, akkor az általában a TCanvas objektumon keresztül történik. Ha megvan a leíró, akkor arra is van lehetőségünk, hogy használjuk a TCanvas objektumot, ami nagyon leegyszerűsíti a rajzolási műveleteket, és teljes mértékben mellőzhetjük a Window GDI függvényeket.
Ha a Desktop-ra akarunk rajzolni, akkor nyilván szükség lesz ennek HDC-jére. Ahhoz viszont, hogy a HDC-t lekérdezzük szükség van az ablak leírójára is. Ez utóbbit a GetDesktopWindow függvénnyel kaphatjuk meg, amit közvetlenül felhasználhatunk a GetWindowDC függvény paramétereként. Ebből már kiderülhetett, hogy az ablak HDC-jét a GetWindowDC függvénnyel tudjuk lekérdezni.

GetWindowDC
function GetWindowDC(
hWnd: HWND
): HDC; stdcall;
Ezzel a függvénnyel tudjuk egy ablak Device Context leíróját lekérdezni.
Paraméterek
hWnd: HWND
Ebben a paraméterben kell megadnunk az ablak leíróját.
Visszatérési érték
A függvény visszatérési értéke az ablak Device Context leírója, vagy 0, ha a lekérdezés nem sikerült.
A HDC ismeretében már rajzolhatunk is a Windows GDI függvényeivel. Ha azonban kényelmesebben akarjuk a rajzolást elvégezni, akkor érdemes egy TCanvas objektumot létrehozni, és annak Handle property-jének átadni a HDC-t.
var
canv: TCanvas;
DC: HDC;
...
DC:=GetWindowDC(GetDesktopWindow);
canv:=TCanvas.Create;
canv.Handle:=DC;
Ettől kezdve, amit a TCanvas objektumon keresztül rajzolunk, az meg fog jelenni a Desktop-on.
Miután befejeztük a rajzolást, a lekérdezett Device Context leírót fel kell szabadítanunk a ReleaseDC függvénnyel.

ReleaseDC
Osztály:
function ReleaseDC(
hWnd: HWND;
hDC: HDC
): Integer; stdcall;
Az előzőleg lekérdezett Device Context leíró felaszabadítására ezt a függvényt használhatjuk.
Paraméterek
hWnd: HWND
A Device Context-hez tartozó ablak leíróját kell megadnunk ebben a paraméterben.
hDC: HDC
Ebben a paraméterben kell megadni a felszabadítandó Device Context leírót.
Visszatérési érték
A függvény visszatérési értéke igaz, ha a felszabadítás megtörtént, és hamis, ha nem.
Miután összefirkáltuk a Desktop-ot, illik azt le is tisztítani. Ezt egyszerűen az InvalidateRect API függvénnyel tehetjük meg.

InvalidateRect
function InvalidateRect(
hWnd: HWND;
lpRect: PRect;
bErase: BOOL
): BOOL; stdcall;
Ezzel a függvénnyel egy ablak adott területét rajzoltathatjuk újra. Ugyanezt a függvényt használhatjuk a képernyő frissítésére is.
Paraméterek
hWnd: HWND
A frissítendő ablak leírója.
lpRect: PRect
A frissítendő terült koordinátái egy TRect struktúrában.
bErase: BOOL
Ha ennek a paraméternek az értéke igaz, akkor az újrarajzolás előtt törli a területet.
Visszatérési érték
Ha a frissítés sikerült, akkor a visszatérési érték igaz, ellenkező esetben hamis.
Megjegyzés
Ha a teljes képernyő tartalmát szeretnénk frissíteni, akkor a hWnd paraméterben 0, az lpRect paraméterben pedig nil-t adjunk meg.