Delphi屏幕截图的实现

首先要得到设备环境的句柄,能够经过GetDC函数来得到,对于这个函数,MSDN上是这样说明的html

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. Syntaxcanvas

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.app

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函数this

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

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.code

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

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. blog

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

复制代码
 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;
相关文章
相关标签/搜索