熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

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

2022-06-13   來源: Delphi編程 

   剪切

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

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

  procedure TFormCutClick(Sender: TObject)

  var

  ARect: TRect;

  begin

  ClipboardAssign(ImagePicture)

  with ImageCanvas do

  begin

  CopyMode := cmWhiteness;

  ARect := Rect( ImageWidth ImageHeight)

  CopyRect(ARect ImageCanvas ARect)

  CopyMode := cmSrcCopy;

  end;

  end;

   粘貼

  從剪貼板上粘貼圖像首先檢測剪貼板上的數據格式如果格式為CF_BITMAP則調用目標位圖的Assign 方法粘貼圖像

  程序清單如下

  procedure TFormPasteButtonClick(Sender: TObject)

  var

  Bitmap: TBitmap;

  begin

  if ClipboardHasFormat(CF_BITMAP) then

  begin

  Bitmap := TBitmapCreate;

  try

  BitmapAssign(Clipboard)

  ImageCanvasDraw( Bitmap)

  finally

  BitmapFree;

  end;

  end;

  end;

  try…finally為資源保護塊參第十二章

   建立自己的剪貼板觀察程序

  在這一節中我們要建立一個自己的剪貼板觀察程序用來保存截獲到剪貼板中的位圖

  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(畫筆)通過粘貼保存等操作可以實現這一功能但卻存在以下一些問題

  程序頻繁切換影響效率當有大量位圖存在時更是如此

  畫筆有一個很討厭的缺陷當剪貼板上的位圖比畫筆界面的客戶區大時客戶區外的位圖被截斷因而往往需要根據所截獲位圖的大小來調整畫筆客戶區的大小並重新進行粘貼而如果開始就把畫筆客戶區調整到足夠大又會覆蓋掉屏幕上一些有用的信息

  為解決這些問題我開發了下面的程序程序啟動時以極小化方式運行此時只要剪貼板中存入位圖則自動彈出一個對話框請求用戶保存如果用戶希望查看確認則可以雙擊運行程序圖標選擇相應按鈕剪貼板中的位圖就會顯示在屏幕上

  部件關鍵屬性設計如下

  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 ButtonClick(Sender: TObject)

  procedure ButtonClick(Sender: TObject)

  procedure SpeedButtonClick(Sender: TObject)

  procedure SpeedButtonClick(Sender: TObject)

  private

  { Private declarations }

  MyBitmap: TBitmap; { 保存截獲的位圖 }

  View: Boolean; { 判斷是否顯示 }

  NextViewerHandle: HWND; { 下一剪貼板觀察器的句柄 }

  procedure WMDrawClipboard(var Msg:TWMDrawClipboard)

  message WM_DRAWCLIPBOARD;

  procedure WMChangeCBChain(var Msg:TWMChangeCBChain)

  message WM_CHANGECBCHAIN;

  { 響應Windows的剪貼板消息 }

  public

  { Public declarations }

  end;

  窗口創建時把該窗口登錄為剪貼板觀察器添加到剪貼板觀察器鏈中同時進行變量部件和剪貼板的初始化

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/25229.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.