1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| // Le type doit être Graphics.TBitmap, il existe un autre
// TBitmap dans les types prédéfinis, qui est de type record !
// Ou alors, mettre la clause windows AVANT Graphics.
// Il faut transmettre le bitmap en 32 bits au presse-papier,
// sinon on obtient une image noire...
// Si l'image source contient des zones transparentes,
// les zones correspondantes seront noires
// dans l'application tierce.
procedure CopyBmpToClipboard(const ABmp:Graphics.TBitmap);
var
hdcSrc, hdcDst: Windows.HDC;
DstBitmap, OldSrcBitmap, OldDstBitmap: Windows.HBITMAP;
bm : Windows.BITMAP;
begin
if not assigned(ABmp) then exit;
hdcDst := Windows.CreateCompatibleDC(0);
Windows.GetObject(ABmp.Handle,SizeOf(bm),@bm);
//ShowMessageFmt('w=%d h=%d planes=%d BitsPixel=%d',[bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel]);
DstBitmap := Windows.CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,32,nil); // /!\
//if DstBitmap=0 then ShowMessage('DstBitmap=0');
OldDstBitmap := Windows.SelectObject(hdcDst,DstBitmap);
//if OldDstBitmap=0 then ShowMessage('OldDstBitmap=0');
if (Windows.BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight,
ABmp.Canvas.Handle, 0, 0, SRCCOPY) = False)
then ShowMessage('Impossible de copier le bitmap dans le presse-papiers.');;
Windows.OpenClipboard(0);
Windows.EmptyClipboard;
Windows.SetClipboardData(Windows.CF_BITMAP, DstBitmap);
Windows.CloseClipboard;
Windows.SelectObject(hdcDst, OldDstBitmap);
Windows.DeleteDC(hdcDst);
end;
procedure CopyBmpFromClipboard(var ABmp:Graphics.TBitmap);
var
hdcSrc, hdcDst: Windows.HDC;
SrcBitmap, DstBitmap, OldSrcBitmap, OldDstBitmap: Windows.HBITMAP;
bm : Windows.BITMAP;
begin
if not assigned(ABmp) then exit;
hdcSrc := Windows.CreateCompatibleDC(0);
hdcDst := Windows.CreateCompatibleDC(0);
Windows.OpenClipboard(0);
SrcBitmap := Windows.GetClipboardData(Windows.CF_BITMAP);
Windows.CloseClipboard;
Windows.GetObject(SrcBitmap,SizeOf(bm),@bm);
DstBitmap := Windows.CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,nil);
OldSrcBitmap := Windows.SelectObject(hdcSrc,SrcBitmap);
OldDstBitmap := Windows.SelectObject(hdcDst,DstBitmap);
if (Windows.BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight,
hdcSrc, 0, 0, SRCCOPY) = False)
then ShowMessage('Impossible de récupérer le bitmap du presse-papiers.');;
ABmp.SetHandles(DstBitmap,0);
Windows.SelectObject(hdcSrc, OldSrcBitmap);
Windows.SelectObject(hdcDst, OldDstBitmap);
Windows.DeleteDC(hdcSrc);
Windows.DeleteDC(hdcDst);
Windows.DeleteObject(SrcBitmap);
end;
// Coller application tierce -> Lazarus : OK
procedure TTestPasToolsForm.Button1Click(Sender: TObject);
var Bmp:Graphics.TBitmap;
begin
Bmp := Graphics.TBitmap.Create;
CopyBmpFromClipBoard(Bmp);
Image2.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
end;
// Copier Lazarus -> application tierce : OK, sauf transparence => noir
procedure TTestPasToolsForm.Button2Click(Sender: TObject);
begin
CopyBmpToClipboard(Image1.Picture.Bitmap);
end;
// Dupliquer Lazarus -> Lazarus : OK
procedure TTestPasToolsForm.Button3Click(Sender: TObject);
var Bmp:Graphics.TBitmap;
begin
CopyBmpToClipboard(Image1.Picture.Bitmap);
Bmp := Graphics.TBitmap.Create;
CopyBmpFromClipBoard(Bmp);
Image2.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
end; |
Partager