Der Ansatz ist richtig, Du ermittelst erstmal die Grösse des benötigten Buffers.
Als nächstes must Du dann einen Buffer mit der entsprechenden Grösse bereitstellen und einen Zeiger darauf übergeben.
Dieser Buffer wird dann von der Funktion mit den Daten gefüllt.
Wenn man das ganze als Datei speichern will, dann bietet sich z.B. ein TMemoryStream als Buffer an:
Delphi-Quellcode:
function SaveRgn(Rgn: HRgn; Filename: string): Boolean;
var
RgnSize: Cardinal;
MStream: TMemoryStream;
begin
Result := False;
MStream := TMemoryStream.Create;
try
RgnSize := GetRegionData(Rgn, 1, nil);
if RgnSize > 0 then
begin
MStream.SetSize(RgnSize);
if GetRegionData(Rgn, RgnSize, PRgnData(MStream.Memory)) = RgnSize then
begin
MStream.SaveToFile(Filename);
Result := True;
end;
end;
finally
MStream.Free;
end;
end;
function LoadRgn(AHandle: HWnd; Filename: string): Boolean;
var
MStream: TMemoryStream;
Rgn: HRgn;
begin
Result := False;
if not FileExists(Filename) then Exit;
MStream := TMemoryStream.Create;
try
MStream.LoadFromFile(FileName);
Rgn := ExtCreateRegion(nil, MStream.Size , TRgnData(MStream.Memory^));
try
if Rgn <> 0 then
Result := SetWindowRgn(AHandle, Rgn, True) <> 0;
finally
DeleteObject(Rgn);
end;
finally
MStream.Free;
end;
end;
Mir schien es beim testen so das die Region nachdem sie mit SetWindowRgn auf ein Fenster übertragen wurde nicht mehr gültig ist, das speichern schlägt dann fehl. Du must die Region also vor der Zuweisung abspeichern.
MfG,
Tryer