// Hiermit
kann man zwischen seinen Projekten transparente PNG
// in die Zwischenablage stellen bzw. aus der Zwischenablage holen.
// Bedingung ist, dass in allen Projekten "CF_PNG"
registriert
// wurde. Mit Fremdprogrammen funktioniert die Transparenz nicht.
// Getestet mit RS 10.4 unter Win11
uses Vcl.ClipBrd;
var
PngFormat: Word;
ms: TMemoryStream;
P: Pointer;
hnd: THandle;
procedure TForm1.FormCreate(Sender: TObject);
begin
PngFormat := RegisterClipboardFormat('CF_PNG');
end;
procedure insboard(mp: TPngImage);
var
bm: TBitmap;
begin
bm := TBitmap.create(mp.Width, mp.Height);
bm.canvas.draw(0, 0, mp);
ms := TMemoryStream.create;
try
mp.SaveToStream(ms);
hnd := GlobalAlloc(GMEM_DDESHARE, ms.Size);
P := GlobalLock(hnd);
try
ms.Seek(0, soBeginning);
ms.ReadBuffer(P^, ms.Size);
finally
GlobalUnlock(hnd);
end;
Clipboard.Open;
Clipboard.SetAsHandle(PngFormat, hnd);
Clipboard.assign(bm);
Clipboard.close;
finally
FreeAndNil(ms);
FreeAndNil(bm);
end;
end;
function ausboard(mp: TPngImage): Boolean;
begin
Result := false;
if not assigned(mp) or not IsClipboardFormatAvailable(PngFormat) then
exit;
try
ms := TMemoryStream.create;
Clipboard.Open;
hnd := Clipboard.GetAsHandle(PngFormat);
Clipboard.close;
if hnd <> 0 then
begin
P := GlobalLock(hnd);
if P <> nil then
begin
try
ms.Write(P^, GlobalSize(hnd));
Result := true;
finally
GlobalUnlock(hnd);
end;
end;
end;
if Result then
begin
ms.Seek(0, soBeginning);
mp.LoadFromStream(ms);
end;
except
end;
FreeAndNil(ms);
end;
// Beispielaufrufe
// Transparente PNG in Zwischenablage stellen
procedure TForm1.Button1Click(Sender: TObject);
var
png: TPngImage;
begin
png := TPngImage.create;
png.LoadFromFile('D:\Bilder\Jerry.png');
insboard(png);
FreeAndNil(png);
end;
// PNG aus der Zwischenablage holen
procedure TForm1.Button2Click(Sender: TObject);
var
png: TPngImage;
begin
png := TPngImage.create;
if ausboard(png) then
Image1.Picture.assign(png)
else
ShowMessage('Fehlgeschlagen');
FreeAndNil(png);
end;
// Bitmap ohne Transparenz aus Zwischenablage
procedure TForm1.Button3Click(Sender: TObject);
begin
Image1.Picture.assign(Clipboard)
end;
|