• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi屏幕截图的实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

首先要获得设备环境的句柄,可以通过GetDC函数来获得,对于这个函数,MSDN上是这样说明的

The GetDC function retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen. You can use the returned handle in subsequent GDI functions to draw in the DC. The device context is an opaque data structure, whose values are used internally by GDI. The GetDCEx function is an extension to GetDC, which gives an application more control over how and whether clipping occurs in the client area. Syntax

HDC GetDC(   __in  HWND hWnd ); Parameters hWnd [in] A handle to the window whose DC is to be retrieved. If this value is NULL, GetDC retrieves the DC for the entire screen. Return value If the function succeeds, the return value is a handle to the DC for the specified window's client area. If the function fails, the return value is NULL.

1.申明一全变量存储GetDC方法得到的句柄,HDC类型
1
2
var
  dc:HDC;

2.在适当时候调用GetDC,將得到的句柄赋值给变量dc,并將得到的句柄赋值给Canvas的句柄(fullCanvas是变量)

1   dc:=GetDC(0);
2   fullCanvas:=TCanvas.Create;
3   fullCanvas.Handle:=dc;

3.然后就是对fullCanvas进行操作,这里也要用到CopyRect函数

procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect);

Copies part of an image from another canvas into the canvas.Use CopyRect to transfer part of the image on another canvas to the image of the TCanvas object.

Dest specifies the rectangle on the canvas where the source image will be copied. The Canvas parameter specifies the canvas with the source image.

Source specifies a rectangle bounding the portion of the source canvas that will be copied.The portion of the source canvas is copied using the mode specified by CopyMode. 

一句话就是,将Canvas中的Source大小的区域拷贝到目标canvas中的Dest區域中,如果这二个面积不相等,会有缩放效果,如果不想有此效果,这二个区域的长宽相等

 1       if SavePictureDialog1.Execute then
 2       begin
 3         bm:=TBitmap.Create;
 4         try
 5           bm.Width:=abs(x2-x1);
 6           bm.Height:=abs(y2-y1);
 7           bm.Canvas.CopyRect(Rect(0,0,bm.Width,bm.Height),fullCanvas,Rect(x1,y1,x2,y2));
 8           bm.SaveToFile(SavePictureDialog1.FileName+'.bmp');
 9         finally
10           bm.Free;
11         end;

其中bm.width:=ABS(x2-x1),bm.heigth:=ABS(y2-y1),如果要全屏截图,则将二个RECT都设置为Rect(0,0,Screen.Width,Screen.heigth)

程序运行如下

要实现有背景的黑层行是这样操作的

(1).设置窗体 AlphaBlend为True,AlphaBlendVaue为150,BorderStyle:=bsNone;

(2).在窗体创建时写如下语句

1       SetWindowPos(0,HWND_TOP,0,0,Screen.Width,Screen.Height,SWP_DRAWFRAME);
2       ClientHeight:=Screen.Height;
3       ClientWidth:=Screen.Width;

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi10.2.3精简版自动激活EmbarcaderoDelphi10.2.3v25.0.29899.2631Litev14.4 ...发布时间:2022-07-18
下一篇:
delphiArray定义数组发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap