对屏幕进行抓屏后保存,图像发生了变形,本在屏幕最右边的内容在图像上却是在左边,不知道有没有人碰到过这样的问题。
谢谢啊!

解决方案 »

  1.   

    bool SaveNewImage(HBITMAP hbitmap,  LPCTSTR  filename, int nColor)
    {
    BITMAP Bitmap;
    HDC         hDC;                         
    DWORD     dwPaletteSize=0,dwBmBitsSize,dwDIBSize,   dwWritten;     
    BITMAPFILEHEADER       bmfHdr;                   
    BITMAPINFOHEADER       bi;                           
    LPBITMAPINFOHEADER   lpbi;           
    HANDLE   fh,   hDib,   hPal,hOldPal=NULL;   
            FILE * pout;
        
    if   (nColor<=   8)   
    dwPaletteSize   =   (1<<nColor)   *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 = nColor;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0; 
    dwBmBitsSize   =   ((Bitmap.bmWidth  *   nColor+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,   Bitmap.bmHeight, 
    (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)+dwPaletteSize,   
    (BITMAPINFO   *)lpbi,   DIB_RGB_COLORS);   
    if   (hOldPal)   
    {   
    SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);   
    RealizePalette(hDC);   
    ::ReleaseDC(NULL,hDC);   
    }   
    pout = fopen("1_0.bmp", "w");

        
    if   (fh   ==   INVALID_HANDLE_VALUE)   
    return   FALSE;   
    //设置位图文件头
    bmfHdr.bfType   =   0x4D42;     //   "BM"   
    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;   

    //write   file   header     
    fwrite(&bmfHdr,sizeof(BITMAPFILEHEADER),1, pout);
    //write   bmp   data   
    fwrite(lpbi, dwDIBSize, 1, pout);
    GlobalUnlock(hDib);   
    GlobalFree(hDib);   
    CloseHandle(fh);   
    DeleteObject(hbitmap);    
    return   TRUE;  

    代码在这能不能帮我看看出什么问题了
      

  2.   

    如果只是截屏的话,不用这么费力。这样接能截屏。
    CDC  hMemDC; CBitmap *hOldBitmap; 
    CWnd * wnd = GetDesktopWindow(); 
    CDC * dc = wnd->GetDC();
    CRect rect;
    wnd->GetWindowRect(rect);
    int x,y;
    x=GetSystemMetrics(SM_CXSCREEN);
    y=GetSystemMetrics(SM_CYSCREEN); hBitmap.DeleteObject(); hMemDC.CreateCompatibleDC(dc);  hBitmap.CreateCompatibleBitmap(dc,m_nDialogWide,m_nDialogHigh);
    hOldBitmap = hMemDC.SelectObject(&hBitmap); hMemDC.StretchBlt(0, 0,m_nDialogWide ,m_nDialogHigh, dc,0,0,m_nDialogWide,m_nDialogHigh,SRCCOPY); 
      

  3.   

    fwrite(lpbi, dwDIBSize, 1, pout);
    错了.
    dwDIBSize是包含了fileheader size,而实际上你写的是cut了fileheader的(fileheader已经在前一句写入)