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

有人做过滚屏截图吗我想问下是怎么做到的?就是原理性的东西[解决办法]在Windows操作系统下,做过滚屏和截图

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

[解决办法]
在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;   }