Delphi - Teljes képernyőre rajzolni képes Canvas objektum készítése

forráskód letöltése
Készítünk egy olyan objektumot, melyet a TCanvas-ból származtatunk és felruházzuk azzal a képességgel, hogy rajzoláskor a teljes képernyő területére rajzoljon minden alkalmazástól függetlenül. Mivel objektumunk a TCanvas-ból jön létre, így rendelkezik minden olyan rajzeszközzel, mely adott ebben az osztályban. Ettől kezdve igen egyszerűen rajzolhatunk a képernyőre szöveget, téglalapot, ellipszist, bármit amit csak tud a TCanvas.
A megoldás abban rejlik, hogy a Canvas azonosítóját (Handle) lecseréljük a teljes képernyőt elérő azonosítóra, melyet a GetDC függvény ad abban az esetben, ha paraméterként nullát adunk át a számára.
constructor TDesktopCanvas.Create;
begin
  inherited Create;
  FDC:=GetDC(0);
  Handle:=FDC;
end;
Ne feledkezzünk meg arról, hogy amikor az objektumunk megszűnik, akkor a GetDC által lefoglalt erőforrásokat fel kell szabadítanunk a ReleaseDC függvény hívásával.
destructor TDesktopCanvas.Destroy;
begin
  Handle:=0;
  ReleaseDC(0, FDC);
  inherited Destroy;
end;
A Canvas objektumot kiegészítjük két új property-vel Width és Height néven, mely a GetWidth és GetHeight függvény segítségével szolgáltatja a rajzoláshoz rendelkezésre álló terület szélességét és magasságát, mely aktuális felbontásával egyezik.
function TDesktopCanvas.GetWidth: integer;
begin
  result:=GetDeviceCaps(Handle, HORZRES);
end;
function TDesktopCanvas.GetHeight: integer;
begin
  result:=GetDeviceCaps(Handle, VERTRES);
end;
Ezek után a felhasználása már egyszerű: miután létrehoztuk az objektumot, ugyanúgy használhatjuk mint bármely más TCanvas-t a különbség csak annyi lesz, hogy most minden közvetlenül a teljes képernyőre kerül, így a rajzolás koordinátarendszere is arra értelmezendő.
procedure TForm1.Button1Click(Sender: TObject);
var
  c: TDesktopCanvas;
begin
  c:=TDesktopCanvas.Create;
  c.Ellipse(10, 10, 200, 200);
  c.TextOut(20, 100, 'Software Online');
  c.Free;
end;