2010-03-19 34 views
3

我已經寫了一些C++代碼來捕獲一個.bmp文件的窗口。Win32窗口捕獲與BitBlt不顯示邊框

BITMAPFILEHEADER get_bitmap_file_header(int width, int height) 
{ 
BITMAPFILEHEADER hdr; 
memset(&hdr, 0, sizeof(BITMAPFILEHEADER)); 
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM" 
hdr.bfSize = 0;//sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (width * height * sizeof(int)); 
hdr.bfReserved1 = 0; 
hdr.bfReserved2 = 0; 
hdr.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); 

return hdr; 
} 

BITMAPINFO get_bitmap_info(int width, int height) 
{ 
BITMAPINFO bmi; 
memset(&bmi.bmiHeader, 0, sizeof(BITMAPINFOHEADER)); 
//initialize bitmap header 
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmi.bmiHeader.biWidth = width; 
bmi.bmiHeader.biHeight = height; 
bmi.bmiHeader.biPlanes = 1; 
bmi.bmiHeader.biBitCount = 4 * 8; 
bmi.bmiHeader.biCompression = BI_RGB; 
bmi.bmiHeader.biSizeImage = width * height * 4; 

return bmi; 
} 

void get_bitmap_from_window(HWND hWnd, int * imageBuff) 
{ 
HDC hDC = GetWindowDC(hWnd); 
SIZE size = get_window_size(hWnd); 
HDC hMemDC = CreateCompatibleDC(hDC); 
RECT r; 

HBITMAP hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy); 
HBITMAP hOld = (HBITMAP)SelectObject(hMemDC, hBitmap); 

BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY); 
    //PrintWindow(hWnd, hMemDC, 0); 

BITMAPINFO bmi = get_bitmap_info(size.cx, size.cy); 
GetDIBits(hMemDC, hBitmap, 0, size.cy, imageBuff, &bmi, DIB_RGB_COLORS); 

SelectObject(hMemDC, hOld); 
    DeleteDC(hMemDC); 
    ReleaseDC(NULL, hDC); 
} 

void save_image(HWND hWnd, char * name) 
{ 
int * buff; 
RECT r; 
SIZE size; 

GetWindowRect(hWnd, &r); 
size.cx = r.right-r.left; 
size.cy = r.bottom-r.top; 

buff = (int*)malloc(size.cx * size.cy * sizeof(int)); 

get_bitmap_from_window(hWnd, buff); 

BITMAPINFO bmi = get_bitmap_info(size.cx, size.cy); 
BITMAPFILEHEADER hdr = get_bitmap_file_header(size.cx, size.cy); 

FILE * fout = fopen(name, "w"); 
fwrite(&hdr, 1, sizeof(BITMAPFILEHEADER), fout); 
fwrite(&bmi.bmiHeader, 1, sizeof(BITMAPINFOHEADER), fout); 
fwrite(buff, 1, size.cx * size.cy * sizeof(int), fout); 

fflush(fout); 
fclose(fout); 
free(buff); 
} 

它可以在XP下找到,但在Vista下窗口的邊界是透明的。

使用PrintWindow解決了這個問題,但由於性能原因無法接受。

是否存在高性能代碼更改,或者可以更改設置以使邊框不透明?

回答

0

使用下面代替

BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY | CAPTUREBLT);