Alternative Formularformen
Mit Delphi lässt sich fast jede gewünschte Formular-Form erzeugen.Im folgenden Beispiel wird eine runde Region erzeugt:Über CreateEllipticRgn lässt sich eine ellipsenartige Region definieren, welche mit SetWindowRgn schließlich gesetzt und angezeigt wird.
procedure TForm1.FormCreate(Sender: TObject); begin if SetWindowRgn(Handle, CreateEllipticRgn(0, 0, Width, Height), True) = 0 then RaiseLastOSError; end;
RaiseLastOSError ist erst ab Delphi 6 verfügbar. Programmierer, die mit älteren Versionen arbeiten müssen an dieser Stelle RaiseLastWin32Error verwenden.Wenn bei diesem Beispiel etwas fehlschlägt, wird unter Umständen die definierte Region nicht mehr freigegeben. War hingegen die Ausführung erfolgreich, wird die Region wie ein normales Formular verwaltet.Mit einer Fehlerbehandlung sieht der Quelltext so aus:
procedure TForm1.FormCreate(Sender: TObject); var RegionHandle: HRGN; begin RegionHandle := CreateEllipticRgn(0, 0, Width, Height); if RegionHandle 0 then begin try if SetWindowRgn(Handle, RegionHandle, True) = 0 then RaiseLastOSError; except DeleteObject(RegionHandle); raise; end; end else RaiseLastOSError; end;
Verwendet man statt der Funktion CreateEllipticRgn eine der anderen Region-erzeugenden Funktionen,lassen sich auch andere Formen darstellen:Rechteck (CreateRectRgn), Vieleck (CreatePolygonRgn), Rechtecke mit abgerundeten Ecken (CreateRoundRectRgn) – (Weitere siehe Online Hilfe von Delphi)Ein anderes Beispiel soll zeigen, wie sich durch Kombination der Regions-Funktionen fast jede beliebige Formular-Form darstellen läst.Formular in Form einer Sprechblase:Dazu wird erst ein Rechteck mit abgerundeten Ecken erstellt, welches dann mit einer weiteren Region verbunden wird, um das Sprechblasen-typische Aussehen zu erhalten.
procedure TForm1.FormCreate(Sender: TObject); var FormRegion, BeakRegion: HRGN; Beak: array[0..2] of TPoint; begin FormRegion := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight - 48, 40, 40); if (FormRegion = 0) then RaiseLastOSError; try Beak[0] := Point(50, ClientHeight - 50); Beak[1] := Point(55, ClientHeight); Beak[2] := Point(80, ClientHeight-50); BeakRegion := CreatePolygonRgn(Beak, 3, WINDING); if (BeakRegion = 0) then RaiseLastOSError; try if CombineRgn(FormRegion, FormRegion, BeakRegion, RGN_OR) = ERROR then RaiseLastOSError; finally DeleteObject(BeakRegion); end; if SetWindowRgn(Handle, FormRegion, True) = 0 then RaiseLastOSError; except DeleteObject(FormRegion); Raise; end; end;
Im OnPaint-Ereignis wird nun ein schwarzer Rahmen um die Sprechblase gezeichnet:
procedure TForm1.FormPaint(Sender: TObject); var TempRgn: HRGN; begin with Canvas.Brush do begin Color := clBlack; Style := bsSolid; end; TempRgn := CreateRectRgn(0, 0, 1, 1); if (TempRgn = 0) then RaiseLastOSError; try if GetWindowRgn(Handle, TempRgn) = ERROR then RaiseLastOSError; if not FrameRgn(Canvas.Handle, TempRgn, Canvas.Brush.Handle, 1, 1) then RaiseLastOSError; finally DeleteObject(TempRgn); Raise; end; end;
Um unschöne Effekte zu vermeiden, sollte man die Eigenschaft BorderStyle des Formulars auf bsNone setzen.