剪切
图像的剪切是首先把图像拷贝到剪贴板而后在原位置用空白图像进行覆盖
下面一段程序表示了图像的剪切
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;
窗口创建时把该窗口登录为剪贴板观察器添加到剪贴板观察器链中同时进行变量部件和剪贴板的初始化
[] [] [] []