在 Delphi 中實現圖片的「複製到剪貼簿 → 從剪貼簿粘貼繪製」是最常見的剪貼簿應用。關鍵在於:使用 TPicture/TPicture.Assign 通用圖片容器,配合 HasFormat(CF_BITMAP) 安全檢查。
Image1: TImage(放在 Panel1 上,用於載入源圖片)btnLoad:載入圖片文件btnCopy:複製到剪貼簿btnPaste:從剪貼簿粘貼繪製到窗體 Canvasunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
btnLoad: TButton;
btnCopy: TButton;
btnPaste: TButton;
procedure FormCreate(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
procedure btnCopyClick(Sender: TObject);
procedure btnPasteClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Clipbrd;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 佈局初始化
Panel1.Align := alTop;
Panel1.Height := 200;
Image1.Align := alClient;
Image1.Proportional := True; // 保持比例縮放顯示
Image1.Stretch := False;
btnLoad.Caption := '載入圖片';
btnCopy.Caption := '複製到剪貼簿';
btnPaste.Caption := '從剪貼簿粘貼繪製';
end;
procedure TForm1.btnLoadClick(Sender: TObject);
begin
with TOpenDialog.Create(Self) do
try
Filter := '圖片文件|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tif|所有文件|*.*';
if Execute then
begin
Image1.Picture.LoadFromFile(FileName);
btnLoad.Caption := '已載入: ' + ExtractFileName(FileName);
end;
finally
Free;
end;
end;
procedure TForm1.btnCopyClick(Sender: TObject);
begin
// 防禦性檢查:無圖片不複製
if Image1.Picture.Graphic = nil then
begin
ShowMessage('請先載入圖片');
Exit;
end;
// 核心:TPicture.Assign 會自動處理各種 Graphic 子類轉換
Clipboard.Assign(Image1.Picture);
btnCopy.Caption := '已複製 (可在畫圖中粘貼)';
end;
procedure TForm1.btnPasteClick(Sender: TObject);
var
BMP: TBitmap;
X, Y: Integer;
begin
// 關鍵安全檢查:剪貼簿必須包含位圖格式
if not Clipboard.HasFormat(CF_BITMAP) then
begin
ShowMessage('剪貼簿中無位圖數據 (CF_BITMAP)');
Exit;
end
BMP := TBitmap.Create;
try
// 從剪貼簿讀取(Assign 內部調用 GetAsHandle 等)
BMP.Assign(Clipboard);
// 計算繪製位置:Panel 右側空白區
X := Panel1.Left + Panel1.Width + 10;
Y := Panel1.Top + 10;
// 直接繪製到窗體 Canvas(演示用,實際應繪製到持久化畫布如 TImage)
Canvas.Draw(X, Y, BMP);
finally
BMP.Free;
end;
btnPaste.Caption := '已繪製到窗體';
end;
end.
Clipboard.Assign(Source) 的多態威力TClipboard.Assign 重載接受 TPersistent。傳入 TPicture 時,內部會:
Picture.Graphic 類型(TBitmap、TJPEGImage、TPNGImage 等)。CF_BITMAP)或 DIB(CF_DIB)放入剪貼簿。HasFormat(CF_BITMAP):安全粘貼的守門員CF_BITMAP = 2(Windows 標準位圖句柄格式)。Assign 會拋異常或產生空圖片。HasFormat。| 常數 | 值 | 說明 |
|---|---|---|
| CF_TEXT | 1 | ANSI 文本 |
| CF_BITMAP | 2 | 位圖句柄 (HBITMAP) |
| CF_METAFILEPICT | 3 | 元文件圖片 |
| CF_DIB | 8 | 設備無關位圖 (DIB) |
| CF_PALETTE | 9 | 調色板 |
| CF_UNICODETEXT | 13 | Unicode 文本 |
| CF_HDROP | 15 | 文件拖放列表 |
| CF_DIBV5 | 17 | DIB V5 (含色彩空間) |