打开APP
userphoto
未登录

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

开通VIP
根据指定窗口句柄进行截屏

1、获取窗口句柄

    见http://blog.csdn.net/dazhong159/article/details/7903382

2、截屏函数代码(包含截屏类和调用示例)

    Screen.h头文件如下:

  1. #ifndef __CSCREEN_H__  
  2. #define __CSCREEN_H__  
  3.   
  4. #include <windows.h>  
  5.   
  6. class CScreen  
  7. {  
  8. public:  
  9.     char *buf;    //可供网络传输的位图数据指针  
  10.     int buf_len; //可供网络传输的位图数据长度  
  11.       
  12.     CScreen(int color_deep=16, HWND hWnd=0, int w=0, int h=0)  
  13.     {  
  14.         if (hWnd != 0) {  
  15.             m_hWnd=hWnd;  
  16.             hhh=::GetDC(m_hWnd);      //检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄  
  17.                                       //以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图  
  18.         }  
  19.           
  20.         hdc = CreateDC("DISPLAY", NULL, NULL, NULL);  //使用指定的名字为一个设备创建设备上下文环境         
  21.         ScrWidth = GetDeviceCaps(hdc, HORZRES);    //屏幕宽度  
  22.         ScrHeight = GetDeviceCaps(hdc, VERTRES);   //屏幕高度         
  23.         hmdc = CreateCompatibleDC(hdc); //创建一个与指定设备兼容的内存设备上下文环境       
  24.         if(w==0 && h==0) {  
  25.             hBmpScreen = CreateCompatibleBitmap(hdc,ScrWidth,ScrHeight); //创建与指定的设备环境相关的设备兼容的位图  
  26.         }  
  27.         else {   
  28.             hBmpScreen = CreateCompatibleBitmap(hdc,w,h);   
  29.             ScrWidth=w;  
  30.             ScrHeight=h;  
  31.         }         
  32.         holdbmp=(HBITMAP)SelectObject(hmdc, hBmpScreen); //选择一对象到指定的设备上下文环境中  
  33.           
  34.         BITMAP            bm;    //bmp图像效果好,非压缩;jpg压缩,便于网络传输  
  35.         BITMAPINFOHEADER    bi;  //位图信息头,大小固定40字节         
  36.         GetObject(hBmpScreen, sizeof(bm), (LPSTR)&bm); //得到指定图形对象的信息          
  37.         bi.biSize = sizeof(BITMAPINFOHEADER);  
  38.         bi.biWidth = bm.bmWidth;  
  39.         bi.biHeight = bm.bmHeight;  
  40.         bi.biPlanes = 1;  
  41.         bi.biBitCount = color_deep;  
  42.         bi.biCompression = BI_RGB;  
  43.         bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;  
  44.         bi.biXPelsPerMeter = 0;  
  45.         bi.biYPelsPerMeter    = 0;  
  46.         bi.biClrUsed = 0;  
  47.         bi.biClrImportant = 0;        
  48.         int ncolors = (1 << bi.biBitCount);  
  49.         if( ncolors > 256 )   
  50.             ncolors = 0;          
  51.         dwLen_1 = bi.biSize + ncolors * sizeof(RGBQUAD);  
  52.         dwLen_2 = dwLen_1+ bi.biSizeImage;  
  53.         hDib =new char[dwLen_2];   
  54.         memcpy(hDib,&bi,sizeof(bi));  
  55.           
  56.         buf=hDib+dwLen_1;  
  57.         buf_len=bi.biSizeImage;  
  58.         //  GetScreen(100, 200, w, h); //初始化调色板数据  
  59.     }  
  60.       
  61.     ~CScreen();   
  62.     void GetScreen();     
  63.     void GetScreen(int x, int y, int w, int h);   
  64.     void SetScreentoPath(char *path);     
  65.     void SetScreen();     
  66.     void SetScreen(int x, int y, int w, int h);   
  67.     void JoinScrData(char *data); //加载位图数据  
  68.       
  69. private:  
  70.     int             ScrWidth;  
  71.     int             ScrHeight;  
  72.     int             dwLen_1;  
  73.     int             dwLen_2;   
  74.     char            *hDib;  
  75.     HDC             hmdc;  
  76.     HDC             hdc;  
  77.     HDC             hhh;  
  78.     HBITMAP         hBmpScreen;  
  79.     HBITMAP         holdbmp;  
  80.     HWND            m_hWnd;  
  81. };  
  82.   
  83. #endif  

    .cpp文件如下:

  1. #include "StdAfx.h"  
  2. #include "Screen.h"  
  3.   
  4.   
  5. CScreen::~CScreen()  
  6. {  
  7.     hBmpScreen = (HBITMAP)SelectObject(hmdc,holdbmp);  
  8.     delete [dwLen_2]hDib;  
  9.     DeleteDC(hdc);  
  10.     DeleteDC(hmdc);  
  11.     if (m_hWnd!=0) {  
  12.         DeleteDC(hhh);  
  13.     }  
  14.     DeleteObject(hBmpScreen);  
  15.     DeleteObject(holdbmp);   
  16. }  
  17.   
  18. void CScreen::GetScreen()  
  19. {     
  20.     //对指定的源设备环境区域中的像素进行位块(bit_block)转换  
  21.     BitBlt(hmdc,0,0,ScrWidth,ScrHeight,hdc,0,0,SRCCOPY);   
  22.   
  23.     //函数获取指定兼容位图的位,然后将其作一个DIB—设备无关位图(Device-Independent Bitmap)使用的指定格式复制到一个缓冲区中  
  24.     GetDIBits(hmdc, hBmpScreen,0L,(DWORD)ScrHeight,(LPBYTE)hDib + dwLen_1,(LPBITMAPINFO)hDib,(DWORD)DIB_RGB_COLORS);        
  25. }  
  26.   
  27. void CScreen::GetScreen(int x,int y,int w,int h)  
  28. {       
  29.     //对指定的源设备环境(hdc)中的像素进行位块转换,以传送至目标设备环境(hmdc)中  
  30.     BitBlt(hmdc,0,0,w,h,hdc,x,y,SRCCOPY);  
  31.   
  32.     //函数获取指定兼容位图的位,然后将其作一个DIB—设备无关位图使用的指定格式复制到一个缓冲区中  
  33.     GetDIBits(hmdc, hBmpScreen,0L,(DWORD)ScrHeight,(LPBYTE)hDib + dwLen_1,(LPBITMAPINFO)hDib,(DWORD)DIB_RGB_COLORS);        
  34. }  
  35.   
  36. void CScreen::SetScreentoPath(char *path)  
  37. {  
  38.    BITMAPFILEHEADER bfh;  
  39.    bfh.bfType = ((WORD)('M'<< 8)|'B');  
  40.    bfh.bfReserved1 = 0;  
  41.    bfh.bfReserved2 = 0;  
  42.    bfh.bfSize = 54+dwLen_2;  
  43.    bfh.bfOffBits = 54;  
  44.    HANDLE hFile=CreateFile(path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  
  45.    DWORD dwWrite;  
  46.    WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwWrite,NULL);  
  47.    WriteFile(hFile, hDib, bfh.bfSize, &dwWrite, NULL);   
  48.    CloseHandle(hFile);     
  49. }  
  50.   
  51. void CScreen::SetScreen()  
  52. {      
  53.     //使用DIB位图和颜色数据对与目标设备环境相关的设备上的指定矩形中的像素进行设置  
  54.     ::SetDIBitsToDevice(hhh,0,0,ScrWidth,ScrHeight,0,0,0,ScrHeight,(LPBYTE)hDib + dwLen_1,(LPBITMAPINFO)hDib, (DWORD)DIB_RGB_COLORS);  
  55. }  
  56.   
  57. void CScreen::SetScreen(int x,int y,int w,int h)  
  58. {      
  59.     //使用指定的DIB位图中发现的颜色数据来设置位图中的像素  
  60.     ::SetDIBits(hhh,hBmpScreen,ScrWidth,ScrHeight,(LPBYTE)hDib + dwLen_1,(LPBITMAPINFO)hDib, (DWORD)DIB_RGB_COLORS);  
  61.   
  62.     //从源矩形中复制一个位图到目标矩形  
  63.     StretchBlt(hhh,x,y,w,h,hdc,0,0,ScrWidth,ScrHeight,SRCCOPY);  
  64. }  
  65.   
  66. void CScreen::JoinScrData(char *data) //加载位图数据  
  67. {  
  68.     memcpy(hDib+dwLen_1, data, dwLen_2-dwLen_1);  
  69. }  

    调用如下:

  1. void CMyDlg::OnOK()   
  2. {  
  3.     // TODO: Add extra validation here  
  4.       
  5.     RECT rect;  
  6.     ::GetWindowRect(m_hWnd,&rect);  
  7.     CScreen *screen=new CScreen(16,NULL,rect.right-rect.left,rect.bottom-rect.top);  
  8.   
  9.     screen->GetScreen(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);  
  10.   
  11.     for (int i=0;i<10000;i++)  
  12.     {  
  13.         screen->SetScreentoPath("1.bmp");  
  14.     }  
  15.   
  16.     delete screen;  
  17.     CDialog::OnOK();  
  18. }  

3、在界面上显示图片

  1. ImageWnd::ImageWnd()  
  2. {  
  3.     Create(NULL,"Image");  
  4.     bitmap=new CBitmap;  
  5.     bitmap->m_hObject=LoadImage(NULL,"1.bmp",IMAGE_BITMAP,120,121,LR_LOADFROMFILE);  
  6.     mdc=new CDC;  
  7.     CClientDC dc(this);  
  8.     mdc->CreateCompatibleDC(&dc);  
  9.     mdc->SelectObject(bitmap);  
  10.       
  11. }  
  1. void ImageWnd::OnPaint()   
  2. {  
  3.     CPaintDC dc(this); // device context for painting  
  4.   
  5.     dc.BitBlt(i,0,120,121,mdc,0,0,SRCCOPY);  
  6.   
  7.     // TODO: Add your message handler code here  
  8.       
  9.     // Do not call CFrameWnd::OnPaint() for painting messages  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
DDB转为DIB
位图的显示
Visual C++ 实现数字图像增强处理
保存MFC的CBitmap对象中的图象到一个BMP文件中
vc 保存Bitmap到文件
截屏保存为Jpg文件的MFC代码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服