C# - Rajzolás közvetlenül a képernyőre

forráskód letöltése
E példában készítünk egy olyan Graphics osztályt, melyet felhasználva a képernyő teljes területére képesek vagyunk rajzolni és nem csak a programunk adott Form-jának területére.
A Graphics osztálynak van egy FromHdc nevű függvénye. Ez egy statikus függvény, mely a Graphics osztály egy új példányát adja vissza. E függvény paraméterként egy IntPtr típusú értéket vár. Hogy mit kell itt értékként megadnunk, ahhoz tegyünk egy kis kitérőt. Ebben a kitérőben vissza kell kanyarodnunk a GDI+ elődjéhez a GDI-hez. Itt találunk egy GetDC függvényt, melynek ha paraméterként nulla értéket adunk, akkor egy olyan leírót kapunk vissza, amelyet felhasználva képesek vagyunk a GDI-ben a képernyő teljes területére rajzolni. Most azonban a GDI+ nyújtotta lehetőségeket szeretnénk kihasználni, így egy Graphics osztályra lenne szükségünk, mely elérheti a képernyő területét.
Nincs más teendőnk ennek megvalósítása érdekében, mint hogy e két függvényt összepárosítsuk.
A GetDC eléréséhez szükségünk lesz a User32.dll rendszer állomány használatára, mivel e függvény ott található meg. Készítsünk egy egyszerű kis osztályt Win32 névvel, melyben egyetlen statikus függvényt deklarálunk, amely a GetDC lesz. Egy DllImport attribútummal megadjuk, hogy e függvényt a User32.dll-ben kell keresnie a fordítónak.
  public class Win32
  {
    [DllImport("user32.dll")]
    public static extern int GetDC(int hWnd);
  }
Ezt követően a GetDC már elérhető, így nincs más teendőnk, mint a Graphics osztály FromHdc függvényét meghívni, melynek paraméterét a GetDC fogja szolgáltatni.
private Graphics screen = Graphics.FromHdc((IntPtr)Win32.GetDC(0));
Ha ez is megvan, akkor adott egy screen nevű Graphics típusú osztály, mellyel tetszőlegesen rajzolhatunk a képernyő teljes területére a már ismert GDI+ függvényeket használva.
screen.FillEllipse(new LinearGradientBrush(rect, c1, c2, r.Next(90), false), rect);