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); |
|