Einzelnen Beitrag anzeigen

Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#9

Re: Region vom Typ THandle abspeichern

  Alt 11. Mai 2004, 19:51
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
  Mit Zitat antworten Zitat