Win32开发入门(22):抓取屏幕

关于如何拷贝屏幕并保存,这里已经有现成的例子,我也不必去Copy人家了,我一向不喜欢Copy。 这里有一个完整的例子,可以看看。

http://msdn.microsoft.com/EN- US/library/windows/desktop/dd183402(v=vs.85).aspx

把屏幕的内容复制到窗口的客户区域中 ,通常会用BitBlt函数,函数的功能是把一块颜色数据从一个DC复制到另一个DC,这个我也不知道怎么 翻译才能通俗一点。这样说吧,就是从源设备上下文的图形表面截取一个矩形区域并且复制到另一个设 备上下文的区域中。就像我们要做一个截屏工具一样,把屏幕的一部分内容复制到窗口上。

下 面呢,我用另一个函数来进行拷贝——StretchBlt函数,这个函数与BitBlt差不多,不过,它有一点, 就是可以根据目标的区域对源图像进行拉伸。

注意看代码。

{
    // 屏幕的DC
    HDC hdcScreen = GetDC(NULL);
    // 本窗口的DC
    HDC hdcWindow = GetDC(hWnd);
    // 屏幕的宽度
    int scrWidth = GetSystemMetrics(SM_CXSCREEN);
    // 屏幕的高度
    int scrHeight = GetSystemMetrics(SM_CYSCREEN);
    // 窗口的客户区域
    RECT rectClient;
    GetClientRect(hWnd, &rectClient);
    // 使用StretchBlt进行复制
    StretchBlt

(hdcWindow,0,0,rectClient.right,rectClient.bottom,hdcScreen,0,0,scrWidth,scrHeight,SRCCOPY

);
    // 释放DC
    ReleaseDC(NULL, hdcScreen);
    ReleaseDC(hWnd, hdcWindow);
}

现在,我们要明确,我们是要把屏幕上的东西往窗口区域复制,所以我们想到,必须先有两 个DC,一个是屏幕的DC,另一个就是窗口的DC。DC通过GetDC函数可以获取,将参数设置为NULL,也就 是获得主屏幕的DC句柄了,NULL可以认为获取桌面的DC。

获取到DC后,我们还必须知道源区域 的宽度和高度,以及目标窗口区域的宽度和高度。

源区域是屏幕,所以我们只要知道了当前屏 幕的高度和宽度就可以了,GetSystemMetrics(SM_CXSCREEN)返回当前屏幕的宽度,GetSystemMetrics (SM_CYSCREEN)获得当前屏幕的高度。

而窗口的区域大小呢?我们不妨先得到窗口客户区域的矩 形大小,用GetClientRect函数填充一个RECT结构体,这个结构体的right成员就是窗口客户区域的宽度 ,bottom成员就是窗口客户区域的高度了。

好了,有了这些基本参数,后面的事情就好办了。

BOOL StretchBlt( _In_ HDC hdcDest, _In_ int nXOriginDest, _In_ int nYOriginDest, _In_ int nWidthDest, _In_ int nHeightDest, _In_ HDC hdcSrc, _In_ int nXOriginSrc, _In_ int nYOriginSrc, _In_ int nWidthSrc, _In_ int nHeightSrc, _In_ DWORD dwRop);

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, getdc
, 窗口
, 区域
, 屏幕
, 一个
, 宽度
获得屏幕宽度
,以便于您获取更多的相关知识。

时间: 2024-10-30 20:28:29

Win32开发入门(22):抓取屏幕的相关文章

Android开发入门(五)屏幕组件 5.4 TableLayout表格布局

TableLayout可以把视图views组织成"行"或"列".可以使用<TableRow>元素指定表格中的一行 .每一行又可以包含一个或多个视图.每行中的每个视图组成了表格的一个元素.每列的宽度,取决于这一 列中宽度最大的视图view. 观察main.xml中的代码: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:androi

Win32开发入门(10) 绘图(C)

今天我们来欣赏一下用于填充图形的函数,当然我不会逐个去介绍,因为我们参考MSDN直接套参数 就可以了. SetDCBrushColor函数有必要扯一下,它的声明如下: COLORREF SetDCBrushColor( __in HDC hdc, __in COLORREF crColor ); 第二个参数,通过RGB宏产生COLORREF传进去就可以了,比如这样: SetDCBrushColor(ps.hdc,RGB(211,254,41)); 但是,如果只是调用这个函数,你会发现 在绘图的时

Win32开发入门(9) 绘图(B)

我们今天继续涂鸦,实践证明,涂鸦是人生一大乐趣. 首先,我们写一个程序骨架子,以便 做实验. #include <Windows.h> LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain( HINSTANCE hThisApp, HINSTANCE hPrevApp, LPSTR lpsCmdln, int iShow) { WNDCLASS wc

Win32开发入门(8) 绘图(A)

从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先 要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们 封装了一些与显示设备相关的交互操作,我们这里说的是图形的绘制,自然指的是显卡.当然,对于同 一客观事物,世界上并不存在唯一的理解方案,技术上的东西最终拿来用的,不应该有硬性的去统一. 我们之中的很多人,最大的失败在于,人家说要这样理解他就毫不怀疑地这样理解,权威人士说要这样 这样,他就不经过大脑思考地跟着那样那样.

Win32开发入门(7) 多边形窗口

通常情况下,窗口都是一个矩形,不过,调用下面这个函数,可以自定义窗口的形状. int SetWindowRgn( __in HWND hWnd, __in HRGN hRgn, __in BOOL bRedraw ); 第一个参数是窗口的句柄,第二个参数也是一个句柄--HRGN,一个多边形的区域,可 以用CreatePolygonRgn函数来创建.第三个参数指定函数调用成功后是否重画窗口,如果窗口还没有显 示,就不必了,如果窗口已经显示,可以考虑设为TRUE. 我们创建用于显示窗口形状的区域句

Win32开发入门(4) 创建菜单

我们当然知道 ,现在,在实际开发中肯定不会像我这样写Win32程序的,你看,连个WinMain都要N行代码.但很多人 不明白什么叫学习,什么叫探索.实际上,通常能用于实际开发中的技巧只是占我们对客观世界的认识 总和不到20%,所以,如果你有兴趣计算一下,估计有80%的知识你不知道用到哪里去了.就算我们今后 不会把Win32程序投入到实际操作中,然而如果你了解过这东西,你会发现很多时候对我们是有帮助的 . 哪怕只是简单认识一下Win32的一些原理,相信对于日后编程的学习和成长,是有益处的. 为了提

Win32开发入门(3) 窗口的重绘

我们今天来吹一下关于窗口重绘的事情,在开始吹牛之前,我们先用上一篇博文中说到的方法写一 个简单的Win32应用程序.代码如下: #include <Windows.h> //先声明一下消息处理函数 LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); // 入口点 int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrvInst

Android开发入门(五)屏幕组件 5.7 ScrollView滚动视图

ScrollView是一种特殊的FrameLayout,使用ScrollView可以使用户能够滚动一个包含views的列表,这样 做的话,就可以利用比物理显示区域更大的空间.有一点需要注意一下,那就是ScrollView只能包含一个子 视图view或ViewGroup(这个ViewGroup通常是LinearLayout). 不要混合使用ListView和ScrollView .ListView被设计用来显示一些相关的信息,同时,ListView也已经被优化了去显示大量的列表lists. 下面的

Android开发入门(五)屏幕组件 5.6 FrameLayout帧布局

FrameLayout就是屏幕上的一个"定位器",可以使用它去显示一个单一的视图.被添加到FrameLayout上 的视图views总是被固定在这个布局的左上角.考虑以下的代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" an

Android开发入门(五)屏幕组件 5.5 RelativeLayout相对布局

使用RelativeLayout,可以通过设置"相对位置"(每个View相对于另一个view的位置),来指定它所包 含的子view的位置.看下面main.xml中的代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" androi