用VC進行屏幕截取編程

發表于:2007-07-14來源:作者:點擊數: 標簽:
潘小龍 顧時明 ---- 屏幕截取是令人比較感興趣的事情.雖然現在有不少應用程序如HYPERSNAP等可以用來截取你所喜歡的屏幕畫面,但是如果能把這個功能加到自己的程序中,就更能利用它強大的作用. ---- 下面用VC來逐步介紹在 Windows 95下的實現過程.首先我們要確
潘小龍 顧時明

---- 屏幕截取是令人比較感興趣的事情.雖然現在有不少應用程序如HYPERSNAP等可以用來截取你所喜歡的屏幕畫面,但是如果能把這個功能加到自己的程序中,就更能利用它強大的作用.

---- 下面用VC來逐步介紹在Windows95下的實現過程.首先我們要確定屏幕截取的區域,用LPRECT結構來定義.可以截取一個窗口,或整個屏幕.以下代碼把選定的屏幕區域拷貝到位圖中.

HBITMAP CopyScreenToBitmap(LPRECT lpRect)
//lpRect 代表選定區域
{
HDC       hScrDC, hMemDC;      
// 屏幕和內存設備描述表
HBITMAP    hBitmap, hOldBitmap;   
// 位圖句柄
int       nX, nY, nX2, nY2;      
// 選定區域坐標
int       nWidth, nHeight;      
// 位圖寬度和高度
int       xScrn, yScrn;         
// 屏幕分辨率

   // 確保選定區域不為空矩形
   if (IsRectEmpty(lpRect))
     return NULL;
   //為屏幕創建設備描述表
   hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
   //為屏幕設備描述表創建兼容的內存設備描述表
   hMemDC = CreateCompatibleDC(hScrDC);
   // 獲得選定區域坐標
   nX = lpRect- >left;
   nY = lpRect- >top;
   nX2 = lpRect- >right;
   nY2 = lpRect- >bottom;
   // 獲得屏幕分辨率
   xScrn = GetDeviceCaps(hScrDC, HORZRES);
   yScrn = GetDeviceCaps(hScrDC, VERTRES);
   //確保選定區域是可見的
   if (nX 〈0)
      nX = 0;
   if (nY 〈  0)
      nY = 0;
   if (nX2 > xScrn)
      nX2 = xScrn;
   if (nY2 > yScrn)
      nY2 = yScrn;
   nWidth = nX2 - nX;
   nHeight = nY2 - nY;
   // 創建一個與屏幕設備描述表兼容的位圖
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
   // 把新位圖選到內存設備描述表中
   hOldBitmap = SelectObject(hMemDC, hBitmap);
   // 把屏幕設備描述表拷貝到內存設備描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
   //得到屏幕位圖的句柄
   hBitmap = SelectObject(hMemDC, hOldBitmap);
   //清除
   DeleteDC(hScrDC);
   DeleteDC(hMemDC);
   // 返回位圖句柄
   return hBitmap;
}
   
得到屏幕位圖句柄以后,我們
可以把屏幕內容粘貼到剪貼板上.
    if (OpenClipboard(hWnd))
     //hWnd為程序窗口句柄
      {
        //清空剪貼板
        EmptyClipboard();
        //把屏幕內容粘貼到剪貼板上,
        hBitmap 為剛才的屏幕位圖句柄
        SetClipboardData(CF_BITMAP, hBitmap);
        //關閉剪貼板
        CloseClipboard();
      }
   我們也可以把屏幕內容以位圖格式存到磁盤文件上.
      
int SaveBitmapToFile(HBITMAP hBitmap ,
LPSTR lpFileName) //hBitmap 為剛才的屏幕位圖句柄
{      //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("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;
   //計算調色板大小
   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);
   *lpbi = bi;
   // 處理調色板   
   hPal = GetStockObject(DEFAULT_PALETTE);
   if (hPal)
   {
      hDC  = GetDC(NULL);
      hOldPal = SelectPalette(hDC, hPal, FALSE);
      RealizePalette(hDC);
   }
   // 獲取該調色板下新的像素值
   GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
 (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
    +dwPaletteSize,
 (BITMAPINFOHEADER *)
    lpbi, DIB_RGB_COLORS);
   //恢復調色板   
   if (hOldPal)
   {
      SelectPalette(hDC, 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);
}

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97