类似Print Screen !用DC可以实现吗,  请指点!!!

解决方案 »

  1.   

    HDC GetDC(
      HWND hWnd   // handle to a window
    );
     
    Parameters
    hWnd 
    Handle to the window whose device context is to be retrieved. If this value is NULL, GetDC retrieves the device context for the entire screen.
      

  2.   

    用GetDC(NULL)就可以得到屏幕的DC了,然后其中每点的色彩值都知道了,只要你再知道BMP格式就可以随意的存储了。
      

  3.   

    http://www.fantasiasoft.net/Documents/BMPFormat.htm
    这篇文章有关BMP格式,很简单的,写一个以后都可以一直用。
      

  4.   

    各位大哥感谢你们回答, 请帮我看一下如下代码:HDC hdc = ::GetDC(NULL);
    HDC hdc2 = ::CreateCompatibleDC(NULL);
    HBITMAP bitmap = ::CreateCompatibleBitmap(NULL);
    ::SelectObject(hdc2, bitmap);
    ::BitBlt(hdc2, 0, 0, 800, 600, hdc, 0, 0, SRCCOPY);能确认,屏幕的内容被拷入内存DC了吗?
      

  5.   

    如下操作
    int nWidth , nHeight;
    nWidth = GetSystemMetrics(SM_CXSCREEN);
    nHeight = GetSystemMetrics(SM_CYSCREEN); HDC hdc = ::GetDC(NULL);
    HDC hdc2 = ::CreateCompatibleDC(NULL);
    HBITMAP bitmap = ::CreateCompatibleBitmap(hdc, nWidth, nHeight);
    ::SelectObject(hdc2, bitmap);
    ::BitBlt(hdc2, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);
             SaveBmp(bitmap, "desk.bmp");
      

  6.   

    BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
    {
     HDC hDC;
     int iBits;
     WORD wBitCount;
     DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
     BITMAP Bitmap;  
     BITMAPFILEHEADER bmfHdr;  
     BITMAPINFOHEADER bi;  
     LPBITMAPINFOHEADER lpbi;  
     HANDLE fh, hDib, hPal,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      wBitCount = 24; 
     
     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.biClrImportant = 0;
     bi.biClrUsed  = 0;
      

  7.   


      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, hBitmap, 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(FileName, 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 TRUE;
    }