當前位置:編程學習大全網 - 編程語言 - DELPHI基礎教程:剪貼板和動態數據交換(壹)[2]

DELPHI基礎教程:剪貼板和動態數據交換(壹)[2]

  剪切

 圖像的剪切是首先把圖像拷貝到剪貼板 而後在原位置用空白圖像進行覆蓋

 下面壹段程序表示了圖像的剪切

 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

  • 上一篇:博學多才的頭腦
  • 下一篇:Windows平臺使用bat腳本導出日誌。
  • copyright 2024編程學習大全網