1 void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)
2 {
3 HDC hDC = ::GetWindowDC(hWnd);
4 ASSERT(hDC);
5
6 HDC hMemDC = ::CreateCompatibleDC(hDC);
7 ASSERT(hMemDC);
8
9 RECT rc;
10 ::GetWindowRect(hWnd, &rc);
11
12 HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
13 ASSERT(hBitmap);
14
15 HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
16 ::PrintWindow(hWnd, hMemDC, 0);
17
18 BITMAP bitmap = {0};
19 ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
20 BITMAPINFOHEADER bi = {0};
21 BITMAPFILEHEADER bf = {0};
22
23 CONST int nBitCount = 24;
24 bi.biSize = sizeof(BITMAPINFOHEADER);
25 bi.biWidth = bitmap.bmWidth;
26 bi.biHeight = bitmap.bmHeight;
27 bi.biPlanes = 1;
28 bi.biBitCount = nBitCount;
29 bi.biCompression = BI_RGB;
30 DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;
31
32 HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
33 LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
34 *lpbi = bi;
35
36 ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
37
38 try
39 {
40 CFile file;
41 file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite);
42 bf.bfType = 0x4d42;
43 dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
44 bf.bfSize = dwSize;
45 bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
46
47 file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
48 file.Write((BYTE*)lpbi, dwSize);
49 file.Close();
50 }
51 catch(CFileException* e)
52 {
53 e->ReportError();
54 e->Delete();
55 }
56
57 GlobalUnlock(hDib);
58 GlobalFree(hDib);
59
60 ::SelectObject(hMemDC, hOldBmp);
61 ::DeleteObject(hBitmap);
62 ::DeleteObject(hMemDC);
63 ::ReleaseDC(hWnd, hDC);
64 }
65
66 // 调用方法
67 HWND hWnd = ::FindWindow(NULL, _T("XXX"));
68 if(hWnd)
69 {
70 SaveHwndToBmpFile(hWnd, _T("F://12.bmp"));
71 }