博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BitBlt 注意事项(CAPTUREBLT) (转)
阅读量:6147 次
发布时间:2019-06-21

本文共 1769 字,大约阅读时间需要 5 分钟。

分类:
 
 

BitBlt 函数用于在设备间传递某块像素,例如向窗口表面呈现位图,或是复制屏幕 (截屏) 。

这篇文字讲述了复制屏幕过程中需要注意的问题。
基本过程:
创建源设备上下文 (hDC = CreateDC,GetDC,GetWindowDC) 。
创建兼容的设备上下文 (hMemDC = CreateCompatibleDC) 。
创建兼容位图 (hBmp = CreateCompatibleBitmap) 。
将 hBmp 选入 hMemDC (hOldBmp = SelectObject) 。
进行拷贝 (BitBlt) 。
将 hOldBmp 还原给 hMemDC (hBmp = SelectObject) 。
删除释放设备上下文 (DeleteDC,ReleaseDC) 。
一般在 BitBlt 过程中指定 SRCCOPY 形式的光栅操作,这样做没有错,事实上也得到了当前屏幕的拷贝,现在观察下面两幅图像:

这是整个屏幕的一部分,左边的图像指定了 SRCCOPY ,右边的图像似乎多了点东西,那是上下文菜单的阴影,截获这层阴影需要用 CAPTUREBLT 与 SRCCOPY 合并。
CAPTUREBLT:
Includes any windows that are layered on top of your window in the resulting image. By default, the image only contains your window. Note that this generally cannot be used for printing device contexts.
(生成的图像中包含您的窗口上层叠的那些窗口。默认情况下,该图像仅包含您的窗口。请注意,这通常无法用于打印设备上下文。)
另外,如果不使用 CAPTUREBLT 光栅操作,结果将不会包含透明度 < 255 的窗口。
C Code - :
HDC hDC, hMemDC;
HANDLE hBmp, hOldBmp;
DWORD w, h;
w = GetSystemMetrics(SM_CXSCREEN);
h = GetSystemMetrics(SM_CYSCREEN);
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hDC);
hBmp = CreateCompatibleBitmap(hDC, w, h);
hOldBmp = SelectObject(hMemDC, hBmp);
BitBlt(hMemDC, 0, 0, w, h, hDC, 0, 0, CAPTUREBLT | SRCCOPY);
hBmp = SelectObject(hMemDC, hOldBmp);
DeleteDC(hDC);
DeleteDC(hMemDC);

 

 

 

 

 

 

 

有一个窗体A,指定了WS_EX_LAYERED风格,

通过

BitBlt + SRCCOPY 可以截取该窗口后面的图像,但是不能截取到该窗口后面的半透明的窗口

 

网上找了很多资料,通过

BitBlt + SRCCOPY | CAPTUREBLT可以截获半透明窗体

 

为了截获窗体后面的图像并包含半透明窗体,我想了两个办法

方法一: 我把窗体A透明,再通过BitBlt + SRCCOPY | CAPTUREBLT截取,截取完再设成不透明

方法二: 我把窗体A移走,再通过BitBlt + SRCCOPY | CAPTUREBLT截取,截取完再移回来

 

但是这两个方法都会闪的很厉害,

请问还有没有别的方法能够取得窗体后面的图像并包含半透明窗体

 

备注:上面说的半透明窗体就是指定了WS_EX_LAYERED风格的窗体

 

///

我记得直接GetDC(NULL)、BitBlt获取的就是窗口后面的图象。

///

直接使用BitBlt + SRCCOPY可以获得LAYERED窗体背后的图像,但是不能获得该窗体后面的LAYERED窗体的图像

///

Vista带的放大镜可以放大后面的LAYERED窗口,不知道怎么实现的

 

 

 

转载地址:http://tomya.baihongyu.com/

你可能感兴趣的文章
DEV实现日期时间效果
查看>>
java注解【转】
查看>>
Oracle表分区
查看>>
centos 下安装g++
查看>>
嵌入式,代码调试----GDB扫盲
查看>>
类斐波那契数列的奇妙性质
查看>>
下一步工作分配
查看>>
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
Wait Functions
查看>>
代码描述10313 - Pay the Price
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>