vc怎么截屏并把截取的图片保存到c盘

vc如何截屏并把截取的图片保存到c盘
各位大虾请问 vc如何截屏并把截取的图片保存到c盘?非常感谢!!!!!!

------解决方案--------------------
C/C++ code

void SaveBitmapToFile(HBITMAP hBmp, LPCWSTR lpfilename)
{
    HDC hdc;   //设备描述表   
    int ibits;     
    WORD wbitcount;     //当前显示分辨率下每个像素所占字节数   

    //位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小   ,写入文件字节数   
    DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;   

    BITMAP bitmap;   //位图属性结构   
    BITMAPFILEHEADER bmfhdr;   //位图文件头结构   
    BITMAPINFOHEADER bi;   //位图信息头结构   
    LPBITMAPINFOHEADER lpbi;   //指向位图信息头结构   

    //定义文件,分配内存句柄,调色板句柄   
    HANDLE fh, hdib, hpal, holdpal=NULL;   

    //计算位图文件每个像素所占字节数   
    hdc = CreateDC(L"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 <= 16)   
        wbitcount = 16;   
    else if (ibits <= 24)   
        wbitcount = 24;   
    else     
        wbitcount  =  32;   

    //计算调色板大小   
    if (wbitcount <= 8)   
        dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);   

    //设置位图信息头结构   
    GetObject(hBmp, 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);   
    *lpbi   =   bi;   

    //   处理调色板     
    hpal   =   GetStockObject(DEFAULT_PALETTE);   
    if   (hpal)   
    {   
        hdc   =   ::GetDC(NULL);   
        holdpal   =   SelectPalette(hdc,   (HPALETTE)hpal,   false);   
        RealizePalette(hdc);   
    }   

    //   获取该调色板下新的像素值   
    GetDIBits(hdc,   hBmp,   0,   (UINT)   bitmap.bmHeight,(LPSTR)lpbi   +     
        sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)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;   

    //   设置位图文件头   
    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);   

}   

HBITMAP CopyScreenToBitmap(LPRECT lpRect,BOOL bSave)
//lpRect 代表选定区域
{
    HDC       hScrDC, hMemDC;      
    // 屏幕和内存设备描述表
    HBITMAP    hBitmap, hOldBitmap;   
    // 位图句柄
    int       nX, nY, nX2, nY2;      
    // 选定区域坐标
    int       nWidth, nHeight;

    // 确保选定区域不为空矩形
    if (IsRectEmpty(lpRect))
        return NULL;
    //为屏幕创建设备描述表
    hScrDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);

    //为屏幕设备描述表创建兼容的内存设备描述表
    hMemDC = CreateCompatibleDC(hScrDC);
    // 获得选定区域坐标
    nX = lpRect->left;
    nY = lpRect->top;
    nX2 = lpRect->right;
    nY2 = lpRect->bottom;

    //获取屏幕分辩率
    int nxScreen = GetSystemMetrics(SM_CXSCREEN);
    int nyScreen = GetSystemMetrics(SM_CYSCREEN);
    //确保选定区域是可见的
    if (nX < 0)
        nX = 0;
    if (nY < 0)
        nY = 0;
    if (nX2 > nxScreen)
        nX2 = nxScreen;
    if (nY2 > nyScreen)
        nY2 = nyScreen;
    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);

    ::SaveBitmapToFile(hBitmap, _T("C:\\截图.bmp"));//这个函数楼上有
    // 返回位图句柄
    return hBitmap;
}