將CRgn rgn對象以圖片形式輸出便於查看

爲了調試方便,將CRgn rgn對象以圖片形式輸出,便於查看
{
 CRgn rgn
 int w = m_lpShapePoints[4].x+4;
 int h = m_lpShapePoints[4].y+4;
 HWND hDesk = GetDesktopWindow();
 HDC hDC = ::GetDC(hDesk);
 CMemDC MemDC(hDC, CSize(w, h), 0);
 for (int x=0; x<w; x++)
 {
  for (int y=0; y<h; y++)
  {
   CPoint pt(x, y);
   if (rgn.PtInRegion(pt))
   {
    CDC *pDC = CDC::FromHandle(MemDC.GetMemDC());
    pDC->SetPixel(x, y, RGB(255, 0, 0));
   }
  }
 }

 SaveBitmap(MemDC.GetHBITMAP(), _T("c://rgnoutput.bmp");
  ::ReleaseDC(hDesk, hDC);
}

BOOL SaveBitmap(HBITMAP hBitmap, LPCTSTR ptzFileName)
{
 HDC hDC;
 DWORD dwSize;
 BOOL bReturn;
 LPBYTE pBits;
 HANDLE hFile;
 BITMAP bmBitmap;
 BITMAPFILEHEADER bfhFile;
 BITMAPINFOHEADER bihInfo;

 // 返回值初始化爲 FALSE
 bReturn = FALSE;
 // 取得屏幕兼容位圖的對象信息
 if (GetObject(hBitmap, sizeof(BITMAP), &bmBitmap))
 {
  // 設置 BITMAPINFOHEADER 結構
  bihInfo.biSize = sizeof(BITMAPINFOHEADER);
  bihInfo.biWidth = bmBitmap.bmWidth;
  bihInfo.biHeight = bmBitmap.bmHeight;
  bihInfo.biPlanes = 1;
  bihInfo.biBitCount = 24;
  bihInfo.biCompression = BI_RGB;
  bihInfo.biSizeImage =  _WidthPitch(bmBitmap.bmWidth) * bmBitmap.bmHeight;
  bihInfo.biXPelsPerMeter = 0;
  bihInfo.biYPelsPerMeter = 0;
  bihInfo.biClrUsed = 0;
  bihInfo.biClrImportant = 0;

  // 設置 BITMAPFILEHEADER 結構
  bfhFile.bfType = 0x4D42;  // "BM"
  bfhFile.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bihInfo.biSizeImage;
  bfhFile.bfReserved1 = 0;
  bfhFile.bfReserved2 = 0;
  bfhFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

  // 分配內存
  pBits = (LPBYTE) HeapAlloc(GetProcessHeap(), 0, bihInfo.biSizeImage);
  if (pBits)
  {
   // 獲取屏幕設備場景
   hDC = CreateIC(_T("DISPLAY"), NULL, NULL, NULL);

   // 獲取 DIB 數據
   if (GetDIBits(hDC, hBitmap, 0, bmBitmap.bmHeight,
    pBits, (LPBITMAPINFO) &bihInfo, DIB_RGB_COLORS))
   {
    // 創建文件
    hFile = CreateFile(ptzFileName, GENERIC_WRITE, 0, NULL,
     CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
     // 寫入 BITMAPFILEHEADER  信息
     bReturn = WriteFile(hFile, &bfhFile, sizeof(BITMAPFILEHEADER), &dwSize, 0);
     if (bReturn)
     {
      // 寫入 BITMAPINFOHEADER 信息
      bReturn = WriteFile(hFile, &bihInfo, sizeof(BITMAPINFOHEADER), &dwSize, 0);
      if (bReturn)
      {
       // 寫入 DIB 數據
       bReturn = WriteFile(hFile, pBits, bihInfo.biSizeImage, &dwSize, 0);
      }
     }

     // 關閉文件句柄
     CloseHandle(hFile);
    }
   }

   // 刪除設備場景,釋放內存
   DeleteDC(hDC);
   HeapFree(GetProcessHeap(), 0, (LPVOID) pBits);
  }
 }

 return bReturn;
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章