Ich hab schon beim letzten Posting im Kopf gehabt, dass es da etwas gab, als ich von 10 Jahren mich damit beschäftigte. Aber ich war mir nicht sicher, also habe ich es nicht erwähnt.
Nun habe ich mir die
OH wieder etwas genauer angeguckt und ja, es gibt etwas besseres als UnionRect, und zwar Regionen. Mit Regionen kann man eine Lochmaske erstellen. Es wird dann nicht das kleinste gemeinsame Rechteck gebildet wie bei UnionRect, sondern eine Lochmaske. Gezeichnet wird nur in die Maske, der Rest wird ignoriert.
Hier ein Beispiel mit zwei Regionen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
FilePath: String;
Bmp: TBitmap;
RgnGesamt, Rgn1, Rgn2: HRGN;
begin
FilePath := 'C:\WINDOWS\Web\Wallpaper\Grüne Idylle.bmp';
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile(FilePath);
RgnGesamt := CreateRectRgn(0, 0, 0, 0);
Rgn1 := CreateRectRgn(100, 100, 200, 200);
Rgn2 := CreateEllipticRgn(300, 300, 400, 400);
CombineRGN(RgnGesamt, Rgn1, Rgn2, RGN_OR);
SelectClipRgn(Canvas.Handle, RgnGesamt);
Canvas.Draw(0, 0, Bmp);
SelectClipRgn(Canvas.Handle, 0);
DeleteObject(RgnGesamt);
DeleteObject(Rgn1);
DeleteObject(Rgn2);
finally
Bmp.Free;
end;
end;
beide Regionen werden kombiniert. Mit SelectClipRgn wird dann ein Bereich erstellt in das gezeichnet werden kann.