首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 拷屏函数的实现
【标  题】:拷屏函数的实现
【关键字】:
【来  源】:http://blog.csdn.net/dijkstar/archive/2006/11/10/1377633.aspx

拷屏函数的实现

void CaptureScreen(char* bmpname)

    HDC       hScrDC, hMemDC;     
   
    int       nX, nY, nX2, nY2;         
   
    int       xScrn, yScrn;        
  
    HBITMAP    hBitmap, hOldBitmap; 

   
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
  
    hMemDC = CreateCompatibleDC(hScrDC);
  
    xScrn = GetDeviceCaps(hScrDC, HORZRES);
    yScrn = GetDeviceCaps(hScrDC, VERTRES);
   
    nX = 0;
    nY = 0;
    nX2 = xScrn;
    nY2 = yScrn;
  
    // 创建一个与屏幕设备描述表兼容的位图
    hBitmap = CreateCompatibleBitmap(hScrDC, nX2, nY2);
   
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
   
    BitBlt(hMemDC, 0, 0, nX2, nY2, hScrDC, nX, nY, SRCCOPY);
   
    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
    
    DeleteDC(hScrDC);
    DeleteDC(hMemDC);

    HDC            hDC;        
    int            iBits;     
   
    WORD           wBitCount;  
       
    DWORD          dwPaletteSize=0,
                   dwBmBitsSize,
                   dwDIBSize, dwWritten;
    BITMAP         Bitmap;       
   
    BITMAPFILEHEADER   bmfHdr;       
   
    BITMAPINFOHEADER   bi;           
    
    LPBITMAPINFOHEADER lpbi;         
   
    HANDLE          fh, hDib, hPal,hOldPal=NULL;
   
 
   
    hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
    iBits = GetDeviceCaps(hDC, BITSPIXEL) *
    GetDeviceCaps(hDC, PLANES);
    DeleteDC(hDC);
    if (iBits <= 1)
      wBitCount = 1;
    else if (iBits <= 4)
      wBitCount = 4;
    else if (iBits <= 8)
      wBitCount = 8;
    else if (iBits <= 24)
      wBitCount = 24;
    else
    wBitCount = iBits;
   
    if (wBitCount <= 8)
      dwPaletteSize = (1 <<  wBitCount) *
      sizeof(RGBQUAD);
  
   
    GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
    bi.biSize            = sizeof(BITMAPINFOHEADER);
    bi.biWidth           = Bitmap.bmWidth;
    bi.biHeight          = Bitmap.bmHeight;
    bi.biPlanes          = 1;
    bi.biBitCount        = wBitCount;
    bi.biCompression     = BI_RGB;
    bi.biSizeImage       = 0;
    bi.biXPelsPerMeter   = 0;
    bi.biYPelsPerMeter   = 0;
    bi.biClrUsed         = 0;
    bi.biClrImportant    = 0;

    dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight;
   
    hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
    *lpbi = bi;

    
    hPal = GetStockObject(DEFAULT_PALETTE);
    if (hPal)
    {
      hDC = ::GetDC(NULL);
      hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);
      RealizePalette(hDC);
    }
   
    GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);
      
    if (hOldPal)
    {
      SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
      RealizePalette(hDC);
      ::ReleaseDC(NULL, hDC);
    }

      
     fh = CreateFile(bmpname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    
     bmfHdr.bfType = 0x4D42; 
     dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; 
     bmfHdr.bfSize = dwDIBSize;
     bmfHdr.bfReserved1 = 0;
     bmfHdr.bfReserved2 = 0;
     bmfHdr.bfOffBits = (DWORD)sizeof
     (BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
    
     WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    
     WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
     &dwWritten, NULL);
    
     GlobalUnlock(hDib);
     GlobalFree(hDib);
     CloseHandle(fh);
}

 

百鸡问题:【上一篇】
三天不练手生(数据结构):【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 病毒名称 解冻变种b Flooder.MSN.ColdFusion.b
  • 視窗:遊戲基類CApplication(.cpp)(二)
  • Looking at real time for Linux,PowerPC, and Cell
  • 如何生成可以在windows下执行的jar文件
  • Cisco的解决方案中PIX VPN的两个问题
  • SpamAssassin
  • [翻译]-Windows CE 程序设计 (3rd 版)--5.2 公共控件(六)
  • C#学习
  • Dreamweaver MX 2004 入门教程之界面详解(1)
  • LINUX指令文件系统--e2fsck
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.