Programming Windows - Chapter 14 Blow-Up程序的错误
在Programming Windows Chapter 14 Blow-Up的程序中,在完成屏幕截取后,作者使用如下代码复制屏幕内容到位图:
HDC hdc = GetDC( _hWnd );
HDC hdcMem = CreateCompatibleDC( hdc );
hBitmap = CreateCompatibleBitmap( hdc, abs(ptEnd.x-ptBeg.x), abs(ptEnd.y-ptBeg.y) );
SelectObject( hdcMem, hBitmap );
StretchBlt( hdcMem,
0, 0,
abs(ptEnd.x-ptBeg.x), abs(ptEnd.y-ptBeg.y),
hdc,
ptBeg.x, ptBeg.y,
ptEnd.x-ptBeg.x, ptEnd.y-ptBeg.y,
SRCCOPY );
DeleteDC( hdcMem );
ReleaseDC( _hWnd, hdc );
在我自己的Win7-32bit下测试是无法正确复制内容的,因为GetDC( _hWnd )只是获取客户区的DC,无法获得客户区外的数据,效果如下:
复制内容后:
为了正确的复制截取的屏幕内容,我们需要获取屏幕DC,并且使用屏幕坐标来进行操作,代码如下:
POINT ptScreenBeg = ptBeg;
POINT ptScreenEnd = ptEnd;
ClientToScreen( _hWnd, &ptScreenBeg );
ClientToScreen( _hWnd, &ptScreenEnd );
HDC hdc = GetDCEx( hWndDesktop, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE );
HDC hdcMem = CreateCompatibleDC( hdc );
hBitmap = CreateCompatibleBitmap( hdc, abs(ptScreenEnd.x-ptScreenBeg.x), abs(ptScreenEnd.y-ptScreenBeg.y) );
SelectObject( hdcMem, hBitmap );
StretchBlt( hdcMem,
0, 0,
abs(ptScreenEnd.x-ptScreenBeg.x), abs(ptScreenEnd.y-ptScreenBeg.y),
hdc,
ptScreenBeg.x, ptScreenBeg.y,
ptScreenEnd.x-ptScreenBeg.x, ptScreenEnd.y-ptScreenBeg.y,
SRCCOPY );
DeleteDC( hdcMem );
ReleaseDC( hWndDesktop, hdc );
这样,我们就可以正确将截取的屏幕内容复制到位图了,如下:
复制内容后: 

浙公网安备 33010602011771号