问题如题

解决方案 »

  1.   

    你搜CopyWindowToBitmap自己改改就能满足需求了。
      

  2.   

    #include "stdafx.h" #include <windows.h> 
    #include <atlimage.h> int __stdcall WinMain( 
                HINSTANCE hInstance, 
                HINSTANCE hPrevInstance, 
                LPSTR lpCmdLine, 
                int nShowCmd) 

        HWND hwnd = ::GetDesktopWindow(); 
        HDC hDC = ::GetDC(hwnd);     RECT rect; 
        ::GetClientRect(hwnd, &rect); 
        HDC hDCMem = ::CreateCompatibleDC(hDC);     HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom); 
        HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);     ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图     CImage image; 
        image.Attach(hBitMap); 
        image.Save("c:\\B.bmp"); 
        image.Detach();     ::SelectObject(hDCMem, hOldMap); 
        ::DeleteObject(hBitMap); 
        ::DeleteDC(hDCMem); 
        ::DeleteDC(hDC);     return 0; 

      

  3.   

    本人对DC的概念还不是很清楚
    感觉对截图还是把握不住
    HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);  
    创建兼容位图, 此时的位图是什么状态?是空白?还是其他?
    ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图    ---这句算是把hDC 中 从点(0,0)到(rect.right, rect.bottom) 这个区域的数据保存到hBitmap了吧那么hDC相当于一张背景图片么?
      

  4.   

    HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);  
    创建兼容位图, 此时的位图是什么状态?是空白?还是其他? 
    ==此时应该是黑底图片。
    ::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//修改里面的参数来保存一部分有用的背景图    ---这句算是把hDC 中 从点(0,0)到(rect.right, rect.bottom) 这个区域的数据保存到hBitmap了吧 
    ===这是把当前桌面指定大小的区域内容复制到内存DC中,存在选入内存DC的hBitmap中。
      

  5.   

    CreateCompatibleBitmap() 默认情况下创建的是一个单色位图,只有一个像素的大小。而你这里是创建了一个rect.right宽,rect.bottom高的一个单色位图。
      

  6.   

    DC就是 "Device Content" , 设备描述表,它是MFC的主要对象之一。通过CDC类进行各种绘图操作,例如选笔,选色,选涂色的花样,选“画”字的大小字体,画直线曲线多变性,画图像(照片)等,可以“画”到屏幕上,“画”到打印机上,“画”到文件里。建议你看看《VC++技术内幕一书》,讲的很好
      

  7.   

    VC6.0下:
    /***********************************************************************
    * 函数名称
    * SaveClientToFile()
    * HWND hWnd 拷屏的窗口句柄
    * CFile file 存储位图的文件
    * 函数功能 实现窗口画面拷贝保存成24色位图文件
    * 2008.11.2
    ***********************************************************************/
    void SaveClientToFile(HWND hWnd, CFile &file)
    {
    HDC hDC, hMemDC;  
    HANDLE hBits;  
    HBITMAP hBitmap, hTmpBmp;  
    HPALETTE hPal;  
    LPVOID lpBits;  
    RGBQUAD RGBQuad;  
    DWORD ImgSize, plSize;  
    int i, CRes, Height, Width;  
    BITMAPFILEHEADER  bmFH;  
    LPBITMAPINFO pBmInfo, pBmInfoMem;  
    LPLOGPALETTE lp;  

    if(hWnd==HWND_DESKTOP) //桌面窗口句柄
    {  
    Width = GetSystemMetrics(SM_CXSCREEN);      //获得桌面的宽度和高度
    Height = GetSystemMetrics(SM_CYSCREEN);  
    }  
    else  
    {  
    RECT  rc; //获取非桌面窗口的宽度和高度
    ::GetWindowRect(hWnd,&rc); 
    Width = rc.right - rc.left;  
    Height = rc.bottom - rc.top;  


    hDC  = ::GetWindowDC(hWnd);             //获取待拷贝窗口的画图设备句柄(不能用GetDC(hWnd)!!!!!!!!!!!!)
    hMemDC = CreateCompatibleDC(hDC);       //为设备句柄创建内存设备上下文
    hBitmap = CreateCompatibleBitmap(hDC, Width, Height);  //为设备句柄初始化位图
    hTmpBmp = CreateCompatibleBitmap(hDC, 8, 8);  
    pBmInfoMem = (LPBITMAPINFO)GlobalAlloc(GHND, sizeof(BITMAPINFO) + 256*sizeof( RGBQUAD ));  
    pBmInfo = (LPBITMAPINFO )GlobalLock(pBmInfoMem);    
    SelectObject(hMemDC, hBitmap); 

    BitBlt(hMemDC, 0, 0, Width, Height, hDC , 0, 0, SRCCOPY);  
    SelectObject(hMemDC, hTmpBmp);  

    ZeroMemory(pBmInfo, sizeof(BITMAPINFO));  
    pBmInfo->bmiHeader.biSize = (DWORD)sizeof(BITMAPINFOHEADER);  
    pBmInfo->bmiHeader.biWidth = Width;  
    pBmInfo->bmiHeader.biHeight = Height;  
    pBmInfo->bmiHeader.biPlanes = 1;  
    pBmInfo->bmiHeader.biBitCount = 24;//(WORD)GetDeviceCaps(hDC, BITSPIXEL);  
    pBmInfo->bmiHeader.biCompression = BI_RGB;  
    GetDIBits(hDC, hBitmap, 0, Height, NULL, pBmInfo, DIB_RGB_COLORS );  
    if(!pBmInfo->bmiHeader.biSizeImage)  
    pBmInfo->bmiHeader.biSizeImage=((((pBmInfo->bmiHeader.biWidth*pBmInfo->bmiHeader.biBitCount)+31) & ~31)/8)*pBmInfo->bmiHeader.biHeight;  
    CRes = GetDeviceCaps(hDC, SIZEPALETTE);  //Number of entries 
    plSize = CRes*sizeof(RGBQUAD);  //调色板的长度
    ImgSize = pBmInfo->bmiHeader.biSizeImage;  

    bmFH.bfType = 0x4d42;  //"BM"  
    bmFH.bfOffBits = plSize + sizeof(BITMAPINFOHEADER) + sizeof( BITMAPFILEHEADER);  
    bmFH.bfSize = ImgSize + bmFH.bfOffBits;  
    bmFH.bfReserved1 = 0;  
    bmFH.bfReserved2 = 0;   file.Write(&bmFH, sizeof(BITMAPFILEHEADER));             //写位图文件头
    file.Write(&(pBmInfo->bmiHeader), sizeof(BITMAPINFOHEADER));  //写位图头信息

    if(CRes)                    //写调色板信息
    {  
    hPal=(HPALETTE)GlobalAlloc(GHND, sizeof(LOGPALETTE) + (CRes*sizeof(PALETTEENTRY)));  
    lp=(LPLOGPALETTE)GlobalLock(hPal);  
    lp->palNumEntries=(WORD)CRes;  
    lp->palVersion=0x0300;  
    GetSystemPaletteEntries(hDC, 0, CRes, lp->palPalEntry);       //获取系统调色板级数
    RGBQuad.rgbReserved=0;  
    for(i = 0; i < CRes; i ++)  
    {  
    RGBQuad.rgbRed = lp->palPalEntry[i].peRed;  
    RGBQuad.rgbGreen = lp->palPalEntry[i].peGreen;  
    RGBQuad.rgbBlue = lp->palPalEntry[i].peBlue;  
    file.Write(&RGBQuad, sizeof(RGBQUAD));  
    }  
    GlobalUnlock(hPal);
    GlobalFree(hPal);  
    }  

    hBits = GlobalAlloc(GHND, pBmInfo->bmiHeader.biSizeImage);  
    lpBits = (LPVOID)GlobalLock(hBits);  
    GetDIBits(hDC, hBitmap, 0, Height, lpBits, pBmInfo, DIB_RGB_COLORS);  
    file.Write(lpBits, ImgSize);                      //写入位图数据
    GlobalUnlock(hBits);  
    GlobalFree( hBits);  

    GlobalUnlock(pBmInfo);  
    GlobalFree(pBmInfoMem);  
    DeleteObject(hTmpBmp);  
    DeleteObject(hBitmap);  
    DeleteDC(hMemDC);  
    ::ReleaseDC(hWnd, hDC);  
    file.Close(); 
    }