delphi截图问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi截图问题相关的知识,希望对你有一定的参考价值。
ScreenDC:=CreateDC('display',Nil,Nil,Nil);
//获取桌面环境
BitBlt(image1.Canvas.Handle,0,0,W_,H_,ScreenDC,200,200,srccopy);
//将桌面图象复制到timage画布中
image1.Refresh;
//释放资源
DeleteDC(ScreenDC);
BitBlt(image1.Canvas.Handle,0,0,500,500,ScreenDC,200,200,srccopy);
这里2对参数用变量赋值不行。宽度和高度 以及上边距和左边距。修改2对数据变量后截图没变化。为什么?
0,0 第一对数据是目标句柄坐标
500,500第二对数据是目标宽度和高度
200,200第三对数据是源图片句柄的坐标。
现在遇到的问题是用定时器连续截图时这3对赋值变量 不能实时改变数据。
这个源码是截屏目的.但我想截指定的窗口,比如 计算器 窗口.我应该改哪里?谢谢
var
Fullscreen: Tbitmap;
FullscreenCanvas: TCanvas;
dc: HDC;
begin
Fullscreen := TBitmap.Create; //创建一个BITMAP来存放图象
Fullscreen.Width := 100;
Fullscreen.Height := 100;
DC := GetDC(0); //取得屏幕的 DC,参数0指的是屏幕
FullscreenCanvas := TCanvas.Create; //创建一个CANVAS对象
FullscreenCanvas.Handle := DC;
Fullscreen.Canvas.CopyRect
(Rect(0, 0, screen.Width, screen.Height), fullscreenCanvas,
Rect(0, 0, Screen.Width, Screen.Height));
//把整个屏幕复制到BITMAP中
FullscreenCanvas.Free; //释放CANVAS对象
ReleaseDC(0, DC); //释放DC
image1.picture.Bitmap := fullscreen; //拷贝下的图象赋给IMAGE对象
image1.Width := fullscreen.Width;
image1.Height := fullscreen.Height;
fullscreen.free; //释放bitmap
form1.WindowState := wsNormal; //复原窗口状态
end;
参考资料:http://zhidao.baidu.com/question/281105230.html
参考技术B 函数原型BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
这里的500,500 对应于复制图像的宽度和高度, 取不同的值会对结果有影响的.这里所说的没有变化是不是image1本身宽度和高度较小, 没有显示完整呢?
Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术
本文刊登2003 年10 月份出版的Dr.Dobb\'s 软件研发第3 期
刘 艺
摘 要
DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对象受到对
象动态绑定机制的限制使得DLL 在封装对象方面有一定的技术难度导致有些Delphi 程
序员误以为DLL 只支持封装函数不支持封装对象本文着重介绍了DLL 中封装和调用对
象的原理和思路并结合实例给出了多种不同的实现方法
关键字动态链接库DLL 对象接口虚方法动态绑定类引用面向对象
1 物理封装与动态链接
物理上的封装意味着将程序封装成若干个独立的物理组成部分各部分之间通过动态链
接共同完成系统的功能而且各个物理组成部分可以单独维护和编译不影响其他部分要
理解物理封装首先要搞清楚静态链接和动态链接
在Delphi 中如果程序的各个模块分别保存在不同的单元文件中并通过uses 指令来
互相调用这就是一个典型的静态链接于是各个静态的子例程编译之后连接器从Delphi
编译过的单元或静态库中取出子例程编译代码并添加到执行文件中最终EXE 文件包
括了程序及其所属单元的所有代码显然静态链接的单元或模块最终以一个独立的物理形
式可执行文件存在除了自己编写的单元文件Delphi 还自动uses 了一些预设的单元
如Windows Messages 等这些都是静态链接
静态链接无法实现物理上的切割和封装而且一旦其中某个单元或模块改动其他所有
单元或模块都得随之重新编译和连接
用于实现物理切割和封装的bpl 包DLL 动态链接库或COM+组件都是一种动态链接
的形式在动态链接情况中连接器只使用子例程external 声明中的信息在执行文件中产生
一些数据表格当Windows 向内存中装载执行文件时它首先装载所有必需的DLL 然后
程序才会启动在装载过程中Windows 用函数在内存中的地址填充程序的内部表格
每当程序调用一个外部函数时它就会使用该内部数据表格直接对DLL 代码它当前
装载在程序的地址空间中进行调用注意该模式不会涉及两个不同的应用程序DLL
已经变成了应用程序的一部分并装载在同一地址空间所有参数的传递都发生在堆栈上
与其它任何函数调用一样这里我们不打算讨论DLL 的编译因为我们首先想重点介绍
Delphi 中的DLL 封装和调用对象技术
2 用DLL 封装对象
DLL Dynamic Link Library 动态链接库就目前来讲已经不再是什么新技术读者可
以在书店过时的Delphi 书籍里随便找到讨论DLL 编程的章节但这些涉及DLL 编程的书
中几乎都是谈论用DLL 来封装函数的实际上大量的程序员也是在使用DLL 来封装函数
或面向过程的一个模块一个函数集合而在这里我只想讨论如何用DLL 来封装对象
这可能是读者未曾有过的DLL 使用经验但这却是这本完全围绕面向对象编程的书中重要
的部分之一或许你能从中发现一些与众不同的实用技巧
参见考虑到目前关于DLL的现成资料很多这里我省略了DLL的基本知识和编写
方法假设读者已经有了一定的DLL编程基础如果你没有这样的基础建议参阅
拙作Delphi6企业级解决方案及应用剖析DLL编程技术一节P271
一般来说使用DLL 封装对象主要有以下好处
以上是关于delphi截图问题的主要内容,如果未能解决你的问题,请参考以下文章