7.1.3.3 粘貼
從剪貼板上粘貼圖像,首先檢測剪貼板上的數據格式。如果格式為CF_BITMAP,則調用目標位圖的Assign 方法粘貼圖像。
程序清單如下。
procedure TForm1.PasteButtonClick(Sender: TObject);
var
Bitmap: TBitmap;
begin
if Clipboard.HasFormat(CF_BITMAP) then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Clipboard);
Image.Canvas.Draw(0, 0, Bitmap);
finally
Bitmap.Free;
end;
end;
end;
try...finally為資源保護塊,參第十二章。
7.1.4 建立自己的剪貼板觀察程序
在這一節中我們要建立一個自己的剪貼板觀察程序,用來保存截獲到剪貼板中的位圖。
Windows允許用戶建立自己的剪貼板觀察程序,並把該程序添加到一個剪貼板觀察器鏈中。在鏈中,位置靠前的程序有義務把有關剪貼板的消息傳遞到緊隨其後的觀察程序。而處於鏈首的程序由Windows的消息循環機制直接把剪貼板消息發送過來。
建立一個剪貼板觀察程序,首先該程序必須能響應相應的Windows消息。對於那些熟悉Microsoft公司Visual Basic的讀者來說,這是令他們頭疼而束手無策的地方。但Delphi在這方面卻有良好的表現:利用關鍵字message,用戶可以將一個過程定義為響應特定的Windows消息。如:
procedure WMDrawClipboard(var Msg:TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
可以響應WM_DRAWCLIPBOARD消息。類TWMDrawClipboard是消息類Message 的子類。Delphi把所有的消息都重新進行了定義,使用戶在使用時可以直接引用其便於記憶的數據成員,而不必再自己動手去分解消息。雖然這並不能算作是一個重大的改進,但卻體現了Delphi處處為用戶方便著想的特點。
我們將要建立的程序目的是把截獲到剪貼板上的位圖保存下來。在本書的寫作過程中,這一工作是大量存在的。雖然利用Windows工具PaintBrush(畫筆),通過粘貼、保存等操作可以實現這一功能,但卻存在以下一些問題:
1.程序頻繁切換影響效率,當有大量位圖存在時更是如此;
2.畫筆有一個很討厭的缺陷:當剪貼板上的位圖比畫筆界面的客戶區大時,客戶區外的位圖被截斷。因而往往需要根據所截獲位圖的大小來調整畫筆客戶區的大小,並重新進行粘貼。而如果開始就把畫筆客戶區調整到足夠大,又會覆蓋掉屏幕上一些有用的信息。