下面是一个我做的截屏函数,在调用该函数的时候,内存资源消耗的特别厉害,我看了半天也不知道是哪里的问题,请高手指教,感激涕零!!!!
HBITMAP CTest005View::CopyScreenToBitmap(LPRECT lpRect)
{
 HDC   hScrDC,   hMemDC;               
    //   屏幕和内存设备描述表   
  HBITMAP   hBitmap,hOldBitmap; 
  CDC* ptempDC;
    //   位图句柄   
  int               nX,   nY,   nX2,   nY2;               
  //   选定区域坐标   
  int               nWidth,   nHeight;               
  //   位图宽度和高度   
  int               xScrn,   yScrn;                     
  //   屏幕分辨率   
        //   确保选定区域不为空矩形   
        if   (IsRectEmpty(lpRect))   
            return   NULL;   
        //为屏幕创建设备描述表   
//hScrDC   =  CreateDC("DISPLAY",   NULL,   NULL,   NULL); 
//hScrDC = GetDC()->GetSafeHdc( );
ptempDC=GetDC();
hScrDC=ptempDC->GetSafeHdc();
        //为屏幕设备描述表创建兼容的内存设备描述表   
        hMemDC   =   CreateCompatibleDC(hScrDC);   
        //   获得选定区域坐标   
        nX   =   lpRect->left;   
        nY   =   lpRect->top;   
        nX2   =   lpRect->right;   
        nY2   =   lpRect->bottom;   
        //   获得屏幕分辨率   
        xScrn   =   GetDeviceCaps(hScrDC,   HORZRES);   
        yScrn   =   GetDeviceCaps(hScrDC,   VERTRES);   
        //确保选定区域是可见的   
        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;   
        //   创建一个与屏幕设备描述表兼容的位图   
        hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);   
        //   把新位图选到内存设备描述表中   
        hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);   
        //   把屏幕设备描述表拷贝到内存设备描述表中   
        BitBlt(hMemDC,0,0,   nWidth,nHeight,hScrDC,   nX,   nY,   SRCCOPY);   
        //得到屏幕位图的句柄   
        hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);   
        //清除     
        DeleteDC(hScrDC);   
        DeleteDC(hMemDC);
        //   返回位图句柄   
        return   hBitmap;   }

解决方案 »

  1.   

    对于此类问题我一般的处理就是寻找新的方法,写程序最终的还是追求结果HBITMAP CMyBitmapDlg::CopyScreenToBitmap(LPRECT lpRect)
    {
    HDC         hScrDC, hMemDC;      
    HBITMAP    hOldBitmap;   
    int         nX, nY, nX2, nY2;      
    int         nWidth, nHeight;      
    int         xScrn, yScrn;         
    if (IsRectEmpty(lpRect))
       return NULL;
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    hMemDC = CreateCompatibleDC(hScrDC);
    nX = lpRect->left;
    nY = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;
    xScrn = GetDeviceCaps(hScrDC, HORZRES);
    yScrn = GetDeviceCaps(hScrDC, VERTRES);
    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;
    hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    ShowWindow(SW_HIDE);
    BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
    hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);
    DeleteDC(hScrDC);
    DeleteDC(hMemDC);
    ShowWindow(SW_SHOW);
    return hBitmap;
    }//开始截图void CExampleDlg::OnBtnCopyscreen() 
    {
    CRect rc;
    GetDesktopWindow()->GetWindowRect(&rc);
    hBitmap=CopyScreenToBitmap(&rc);
    }//复制到剪贴板if (OpenClipboard())
    {
       EmptyClipboard();
       SetClipboardData(CF_BITMAP, hBitmap);
       CloseClipboard();