BitBlt 注意事项(CAPTUREBLT)

152 篇文章 1 订阅
 

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://hi.baidu.com/dedicatus545/blog/item/3fc552811060dadf9023d97a.html

http://topic.csdn.net/u/20081007/18/86a3c0dd-d180-4334-a5f0-6a548019a90b.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值