窗口截图

 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 }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值