您现在的位置是:首页 >

dde数据交换 DELPHI基础教程:剪贴板和动态数据交换(一)[2]

火烧 2022-04-03 23:41:35 1056
DELPHI基础教程:剪贴板和动态数据交换(一)[2]   剪切  图像的剪切是首先把图像拷贝到剪贴板 而后在原位置用空白图像进行覆蓋   下面一段程序表示了图像的剪切   rocedure TFor

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)

dde数据交换 DELPHI基础教程:剪贴板和动态数据交换(一)[2]

  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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码