现在的位置: 首页 > 综合 > 正文

屏幕及窗口拷贝

2013年10月05日 ⁄ 综合 ⁄ 共 3431字 ⁄ 字号 评论关闭

以下来自于:http://www.codeguru.com/forum/showthread.php?t=244907

 

#define PW_WINDOW          9001
#define PW_CLIENT             9002

HBITMAP CMyProgramDlg::CopyScreenToBitmap(LPRECT lpRect)
{
 HDC         hScrDC, hMemDC;         // screen DC and memory DC    
 int         nX, nY, nX2, nY2;       // coordinates of rectangle to grab    
 int         nWidth, nHeight;        // DIB width and height    
 int         xScrn, yScrn;           // screen resolution     

 HGDIOBJ     hOldBitmap , hBitmap;
  
  // check for an empty rectangle
    if (IsRectEmpty(lpRect))      
    return NULL;     
    // create a DC for the screen and create    
    // a memory DC compatible to screen DC         

   hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);    
   hMemDC = CreateCompatibleDC(hScrDC);      // get points of rectangle to grab 
  
   nX = lpRect->left;    
   nY = lpRect->top;    
   nX2 = lpRect->right;    
   nY2 = lpRect->bottom;      // get screen resolution     
  
   xScrn = GetDeviceCaps(hScrDC, HORZRES);    
   yScrn = GetDeviceCaps(hScrDC, VERTRES);     
  
   //make sure bitmap rectangle is visible     
  
   if (nX < 0)        
   nX = 0;    
  
   if (nY < 0)        
      nY = 0;    
  
   if (nX2 > xScrn)        
      nX2 = xScrn;    
  
   if (nY2 > yScrn)        
      nY2 = yScrn;     

   nWidth = nX2 - nX;    
   nHeight = nY2 - nY;     
  
   // create a bitmap compatible with the screen DC    
  
   hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);     
  
   // select new bitmap into memory DC    
  
   hOldBitmap =   SelectObject (hMemDC, hBitmap);     
  
   // bitblt screen DC to memory DC    
  
   BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);    
  
   // select old bitmap back into memory DC and get handle to    
   // bitmap of the screen         
  
   hBitmap = SelectObject(hMemDC, hOldBitmap);     

   // clean up     
  
   DeleteDC(hScrDC);    
   DeleteDC(hMemDC);     
 
   // return handle to the bitmap     
  
   return (HBITMAP)hBitmap;
}

HBITMAP CYourProgramDlg::CopyWindowToBitmap(CWnd* wnd , HWND hWnd, WORD fPrintArea)
{
 HBITMAP     hBitmap = NULL;  // handle to device-dependent bitmap     
 // check for a valid window handle     
 if (!hWnd)        
     return NULL;

    RECT    rectWnd;
    ::GetWindowRect(hWnd, &rectWnd); 

 switch (fPrintArea)    
 {        
  case PW_WINDOW: // copy entire window        
  {            
          // get the window rectangle             
          // get the bitmap of that window by calling            
    // CopyScreenToBitmap and passing it the window rect                    
//    GetWindowRect(&rectWnd);
    hBitmap = CopyScreenToBitmap(&rectWnd);            
    break;        
  }  
       case PW_CLIENT: // copy client area        
    {            
      RECT rectClient;            
      POINT pt1, pt2;              // get client dimensions             
      wnd->GetClientRect(&rectClient);              // convert client coords to screen coords             
      pt1.x = rectClient.left;            
      pt1.y = rectClient.top;            
      pt2.x = rectClient.right;            
      pt2.y = rectClient.bottom;            
      wnd->ClientToScreen(&pt1);            
      wnd->ClientToScreen(&pt2);            
      rectClient.left = pt1.x;            
      rectClient.top = pt1.y;            
      rectClient.right = pt2.x;            
      rectClient.bottom = pt2.y; 

         // get the bitmap of the client area by calling            
      // CopyScreenToBitmap and passing it the client rect                         
      hBitmap = CopyScreenToBitmap(&rectClient);            
      break;        
    }             
    default:    // invalid print area            
         return NULL;    
 }      // return handle to the bitmap    
 
 return hBitmap;
}A good usage is :

Code:
HBITMAP hBitmap = CopyWindowToBitmap(this,GetDesktopWindow()->m_hWnd,PW_

抱歉!评论已关闭.