打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
窗口截图(二)
窗口截图,可以获取遮挡窗口完整的图像,并保存到bmp文件中去。主要用到的函数中PrintWindow,VC6不支持该函数,请使用VS2008来编译。其它需求如平台要求请参考MSDN文档。
view plaincopy to clipboardprint?
01.void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)  
02.{  
03.    HDC hDC = ::GetWindowDC(hWnd);  
04.    ASSERT(hDC);  
05.      
06.    HDC hMemDC = ::CreateCompatibleDC(hDC);  
07.    ASSERT(hMemDC);  
08.      
09.    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.   CaptureWindow(hWnd, _T("F:\\12.bmp"));  
71.} 
void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)
{
 HDC hDC = ::GetWindowDC(hWnd);
 ASSERT(hDC);
 
 HDC hMemDC = ::CreateCompatibleDC(hDC);
 ASSERT(hMemDC);
 
 RECT rc;
 ::GetWindowRect(hWnd, &rc);
 HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
 ASSERT(hBitmap);
 
 HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
 ::PrintWindow(hWnd, hMemDC, 0);
 BITMAP bitmap = {0};
 ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
 BITMAPINFOHEADER bi = {0};
 BITMAPFILEHEADER bf = {0};
 CONST int nBitCount = 24;
 bi.biSize = sizeof(BITMAPINFOHEADER);
 bi.biWidth = bitmap.bmWidth;
 bi.biHeight = bitmap.bmHeight;
 bi.biPlanes = 1;
 bi.biBitCount = nBitCount;
 bi.biCompression = BI_RGB;
 DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;
 HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
 LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
 *lpbi = bi;
 ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
 try
 {
  CFile file;
  file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite);
  bf.bfType = 0x4d42;
  dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  bf.bfSize = dwSize;
  bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
  file.Write((BYTE*)lpbi, dwSize);
  file.Close();
 }
 catch(CFileException* e)
 {
  e->ReportError();
  e->Delete();
 }
 GlobalUnlock(hDib);
 GlobalFree(hDib);
 ::SelectObject(hMemDC, hOldBmp);
 ::DeleteObject(hBitmap); 
 ::DeleteObject(hMemDC);
 ::ReleaseDC(hWnd, hDC);
}
// 调用方法
HWND hWnd = ::FindWindow(NULL, _T("XXX"));
if(hWnd)
{
   CaptureWindow(hWnd, _T("F:\\12.bmp"));
}
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/VisualEleven/archive/2011/02/25/6206715.aspx
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
抓窗口的图片
保存MFC的CBitmap对象中的图象到一个BMP文件中
vc 保存Bitmap到文件
将屏幕保存为图片 将当前MFC程序保存为图片
创建DIB调色板对象步骤
显示位图
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服