Alternative Formularformen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
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.