剪切
圖像的剪切是首先把圖像拷貝到剪貼板 而後在原位置用空白圖像進行覆蓋
下面壹段程序表示了圖像的剪切
procedure TForm Cut Click(Sender: TObject)
var
ARect: TRect;
begin
Clipboard Assign(Image Picture)
with Image Canvas do
begin
CopyMode := cmWhiteness;
ARect := Rect( Image Width Image Height)
CopyRect(ARect Image Canvas ARect)
CopyMode := cmSrcCopy;
end;
end;
粘貼
從剪貼板上粘貼圖像 首先檢測剪貼板上的數據格式 如果格式為CF_BITMAP 則調用目標位圖的Assign 方法粘貼圖像
程序清單如下
procedure TForm PasteButtonClick(Sender: TObject)
var
Bitmap: TBitmap;
begin
if Clipboard HasFormat(CF_BITMAP) then
begin
Bitmap := TBitmap Create;
try
Bitmap Assign(Clipboard)
Image Canvas Draw( Bitmap)
finally
Bitmap Free;
end;
end;
end;
try…finally為資源保護塊 參第十二章
建立自己的剪貼板觀察程序
在這壹節中我們要建立壹個自己的剪貼板觀察程序 用來保存截獲到剪貼板中的位圖
Windows允許用戶建立自己的剪貼板觀察程序 並把該程序添加到壹個剪貼板觀察器鏈中 在鏈中 位置靠前的程序有義務把有關剪貼板的消息傳遞到緊隨其後的觀察程序 而處於鏈首的程序由Windows的消息循環機制直接把剪貼板消息發送過來
建立壹個剪貼板觀察程序 首先該程序必須能響應相應的Windows消息 對於那些熟悉Microsoft公司Visual Basic的讀者來說 這是令他們頭疼而束手無策的地方 但Delphi在這方面卻有良好的表現 利用關鍵字message 用戶可以將壹個過程定義為響應特定的Windows消息 如
procedure WMDrawClipboard(var Msg:MDrawClipboard)
message WM_DRAWCLIPBOARD;
可以響應WM_DRAWCLIPBOARD消息 類MDrawClipboard是消息類Message 的子類 Delphi把所有的消息都重新進行了定義 使用戶在使用時可以直接引用其便於記憶的數據成員 而不必再自己動手去分解消息 雖然這並不能算作是壹個重大的改進 但卻體現了Delphi處處為用戶方便著想的特點
我們將要建立的程序目的是把截獲到剪貼板上的位圖保存下來 在本書的寫作過程中 這壹工作是大量存在的 雖然利用Windows工具PaintBrush(畫筆) 通過粘貼 保存等操作可以實現這壹功能 但卻存在以下壹些問題
程序頻繁切換影響效率 當有大量位圖存在時更是如此
畫筆有壹個很討厭的缺陷 當剪貼板上的位圖比畫筆界面的客戶區大時 客戶區外的位圖被截斷 因而往往需要根據所截獲位圖的大小來調整畫筆客戶區的大小 並重新進行粘貼 而如果開始就把畫筆客戶區調整到足夠大 又會覆蓋掉屏幕上壹些有用的信息
為解決這些問題 我開發了下面的程序 程序啟動時 以極小化方式運行 此時只要剪貼板中存入位圖 則自動彈出壹個對話框請求用戶保存 如果用戶希望查看確認 則可以雙擊運行程序圖標 選擇相應按鈕 剪貼板中的位圖就會顯示在屏幕上
部件關鍵屬性設計如下
ClipSaveForm:
Caption= Save Bitmap in Clipboard
Panel :
Align = Top
Image :
Align = Client
SaveDialog :
FileEditStyle = fsEdit
FileName = * bmp
Filter = Bitmap Files(* bmp)|* bmp|Any Files(* *)|* *
InitialDir = c:\bmp
Title = Save Bitmap
程序主窗口是TForm派生類TClipSaveForm的實例 TClipSaveForm通過定義壹些私有數據成員和過程 使響應和處理Windows的相應消息成為可能 下面是TClipSaveForm的類定義
type
TClipSaveForm = class(TForm)
SaveDialog : TSaveDialog;
Image : TImage;
Panel : TPanel;
Button : TButton;
SpeedButton : TSpeedButton;
SpeedButton : TSpeedButton;
Button : TButton;
procedure FormCreate(Sender: TObject)
procedure FormDestroy(Sender: TObject)
procedure Button Click(Sender: TObject)
procedure Button Click(Sender: TObject)
procedure SpeedButton Click(Sender: TObject)
procedure SpeedButton Click(Sender: TObject)
private
{ Private declarations }
MyBitmap: TBitmap; { 保存截獲的位圖 }
View: Boolean; { 判斷是否顯示 }
NextViewerHandle: HWND; { 下壹剪貼板觀察器的句柄 }
procedure WMDrawClipboard(var Msg:MDrawClipboard)
message WM_DRAWCLIPBOARD;
procedure WMChangeCBChain(var Msg:MChangeCBChain)
message WM_CHANGECBCHAIN;
{ 響應Windows的剪貼板消息 }
public
{ Public declarations }
end;
窗口創建時 把該窗口登錄為剪貼板觀察器 添加到剪貼板觀察器鏈中 同時進行變量 部件和剪貼板的初始化
lishixinzhi/Article/program/Delphi/201311/25229