知识大全 剪贴板和动态数据交换(一)[2]
Posted 知
篇首语:知识比金钱宝贵,比刀剑锋利,比枪炮威力大。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 剪贴板和动态数据交换(一)[2]相关的知识,希望对你有一定的参考价值。
DELPHI基础教程:剪贴板和动态数据交换(一)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
剪切
图像的剪切是首先把图像拷贝到剪贴板 而后在原位置用空白图像进行覆蓋
下面一段程序表示了图像的剪切
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;
窗口创建时 把该窗口登录为剪贴板观察器 添加到剪贴板观察器链中 同时进行变量 部件和剪贴板的初始化
cha138/Article/program/Delphi/201311/25229相关参考
DELPHI基础教程:剪贴板和动态数据交换(一)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
DELPHI基础教程:剪贴板和动态数据交换(一)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
DELPHI基础教程:剪贴板和动态数据交换(二)[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
DELPHI基础教程:剪贴板和动态数据交换(二)[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
DELPHI基础教程:剪贴板和动态数据交换(二)[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
DELPHI基础教程:剪贴板和动态数据交换(二)[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
利用剪贴板实现高速导出数据到Excel 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在很多的时
知识大全 数据结构考研分类复习真题 第八章 动态存储管理[2]
.二进制地址为大小为()和()块的伙伴地址分别为_________________【上海大学二(分)】 无用单元是指________例________【北方交通大学二(分)】 四应用题 .伙
知识大全 动态性能视图,Oracle数据库维护的好帮手(一)
动态性能视图,Oracle数据库维护的好帮手(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
PB中实现数据窗口动态排序的三种方法[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! str