有人做过滚屏截图吗解决方案

有人做过滚屏截图吗
我想问下是怎么做到的?就是原理性的东西

------解决方案--------------------
在Windows操作系统下,做过滚屏和截图,我是这样弄的:

滚屏: 通过Bitblt等Windows的绘图API函数,不断修改绘制坐标来实现。

截图:先通过API获取屏幕HDC,将屏幕HDC内容先写到内存,然后按照BMP等文件格式,
将BMP头,图像数据等等全部写入文件。


------解决方案--------------------
什么是滚屏截图?翻页?每翻一页截图一次?
截图的程序我有
C/C++ code
int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName) 
{         
    HDC            hDC; //É豸ÃèÊö±í
    int            iBits;//µ±Ç°ÏÔʾ·Ö±æÂÊÏÂÿ¸öÏñËØËùÕ¼×Ö½ÚÊý
    WORD           wBitCount;//λͼÖÐÿ¸öÏñËØËùÕ¼×Ö½ÚÊý    
    DWORD          dwPaletteSize=0;//¶¨Òåµ÷É«°å´óС
    DWORD          dwBmBitsSize;//λͼÖÐÏñËØ×Ö½Ú´óС
    DWORD          dwDIBSize;// λͼÎļþ´óС
    DWORD          dwWritten;//дÈëÎļþ×Ö½ÚÊý
    BITMAP         Bitmap;//λͼ½á¹¹
    BITMAPFILEHEADER   bmfHdr;   //λͼÊôÐԽṹ    
    BITMAPINFOHEADER   bi;       //λͼÎļþÍ·½á¹¹
    LPBITMAPINFOHEADER lpbi;     //λͼÐÅϢͷ½á¹¹     Ö¸ÏòλͼÐÅϢͷ½á¹¹
    HANDLE          fh;//¶¨ÒåÎļþ¾ä±ú
    HANDLE            hDib;//·ÖÅäÄÚ´æ¾ä±ú
    HANDLE            hPal;//·ÖÅäÄÚ´æ¾ä±ú
    HANDLE          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 if (iBits<=32)
        wBitCount = 24;
    
    
    //¼ÆËãµ÷É«°å´óС    
    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);
    if (lpbi==NULL)
    {
        return 0;
    }
    
    *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,
        (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);    
    //»Ö¸´µ÷É«°å       
    if (hOldPal)        
    {        
        SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);        
        RealizePalette(hDC);        
        ReleaseDC(NULL, hDC);        
    }    
    //´´½¨Î»Í¼Îļþ        
    fh = CreateFile(lpFileName, GENERIC_WRITE,         
        0, NULL, CREATE_ALWAYS,        
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);    

    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;
    
    // дÈëλͼÎļþÍ·    
    WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    
    // дÈëλͼÎļþÆäÓàÄÚÈÝ    
    WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
    
    //Çå³ý       
    GlobalUnlock(hDib);    
    GlobalFree(hDib);    
    CloseHandle(fh);
    
    return 1;
}

HBITMAP   GetCaptureBmp()   
{
    HDC     hDC;   
    HDC     MemDC;   
    BYTE*   Data;   
    HBITMAP   hBmp;   
    BITMAPINFO   bi;   
    
    memset(&bi,   0,   sizeof(bi));   
    bi.bmiHeader.biSize   =   sizeof(BITMAPINFO);
    bi.bmiHeader.biWidth   =  GetSystemMetrics(SM_CXSCREEN);   
    bi.bmiHeader.biHeight   = GetSystemMetrics(SM_CYSCREEN);   
    bi.bmiHeader.biPlanes   =   1;   
    bi.bmiHeader.biBitCount   =   24;   
    
    hDC   =   GetDC(NULL);   
    MemDC   =   CreateCompatibleDC(hDC);   
    hBmp   =   CreateDIBSection(MemDC,   &bi, DIB_RGB_COLORS,   (void**)&Data,   NULL,   0);   
    SelectObject(MemDC,   hBmp);   
    BitBlt(MemDC,   0,   0,   bi.bmiHeader.biWidth,   bi.bmiHeader.biHeight,hDC,   0,   0,   SRCCOPY);   
    ReleaseDC(NULL,   hDC);     
    DeleteDC(MemDC);   
    return   hBmp;   
}