WZDBTMAP.CPP
上传用户:juying163
上传日期:2014-09-24
资源大小:5867k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // WzdBtmap.cpp : implementation of the CWzdBitmap class
  2. //
  3. #include "stdafx.h"
  4. #include "WzdBtmap.h"
  5. /////////////////////////////////////////////////////////////////////////////
  6. // CWzdBitmap
  7. IMPLEMENT_DYNAMIC(CWzdBitmap, CBitmap)
  8. CWzdBitmap::CWzdBitmap()
  9. {
  10. m_pPalette=NULL;
  11. }
  12. CWzdBitmap::~CWzdBitmap()
  13. {
  14. if (m_pPalette)
  15. {
  16. delete m_pPalette;
  17. }
  18. }
  19. void CWzdBitmap::LoadBitmapEx(UINT nID, BOOL bTransparent )
  20. {
  21. // can only load once
  22. ASSERT(!m_pPalette);
  23. CDC dcScreen;
  24. dcScreen.Attach(::GetDC(NULL));
  25. // find and lock bitmap resource
  26. HRSRC hRsrc = FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(nID),RT_BITMAP);
  27. HGLOBAL hglb = LoadResource(AfxGetResourceHandle(), hRsrc);
  28. LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);
  29. // get pointers into bitmap structures (header, color table and picture bits)
  30. LPBITMAPINFO pBitmapInfo = (LPBITMAPINFO)lpBitmap;
  31. LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)lpBitmap;
  32.   // if the picture data uses more then 8 bits per pixel, there's
  33. // no color table to turn into a palette
  34.    int nNumberOfColors=0;
  35. if (lpBitmap->biClrUsed)
  36. nNumberOfColors = lpBitmap->biClrUsed;
  37. else if (pBitmapInfoHeader->biBitCount <= 8)
  38.     nNumberOfColors = (1<<pBitmapInfoHeader->biBitCount);
  39. LPBYTE pBitmapPictureData = (LPBYTE)lpBitmap+lpBitmap->biSize+
  40. (nNumberOfColors*sizeof(RGBQUAD));
  41. // get width and height
  42. m_Width = lpBitmap->biWidth;
  43. m_Height = lpBitmap->biHeight;
  44. // create a logical palette from the color table in this bitmap 
  45. if (nNumberOfColors)
  46. {
  47. LOGPALETTE *pLogPal = (LOGPALETTE *)new BYTE[
  48. sizeof(LOGPALETTE) + (nNumberOfColors * sizeof(PALETTEENTRY))];
  49. pLogPal->palVersion    = 0x300;
  50. pLogPal->palNumEntries = nNumberOfColors;
  51. for (int i = 0;  i < nNumberOfColors;  i++)
  52. {
  53. // if flag set, replace grey color with window's background color
  54. if (bTransparent && 
  55. pBitmapInfo->bmiColors[i].rgbRed==192 &&
  56. pBitmapInfo->bmiColors[i].rgbGreen==192 &&
  57. pBitmapInfo->bmiColors[i].rgbBlue==192)
  58. {
  59. pBitmapInfo->bmiColors[i].rgbRed=  GetRValue(::GetSysColor(COLOR_BTNFACE));
  60. pBitmapInfo->bmiColors[i].rgbGreen=GetGValue(::GetSysColor(COLOR_BTNFACE));
  61. pBitmapInfo->bmiColors[i].rgbBlue= GetBValue(::GetSysColor(COLOR_BTNFACE));
  62. }
  63. pLogPal->palPalEntry[i].peRed   = pBitmapInfo->bmiColors[i].rgbRed;
  64. pLogPal->palPalEntry[i].peGreen = pBitmapInfo->bmiColors[i].rgbGreen;
  65. pLogPal->palPalEntry[i].peBlue  = pBitmapInfo->bmiColors[i].rgbBlue;
  66. pLogPal->palPalEntry[i].peFlags = 0;
  67. }
  68. m_pPalette=new CPalette;
  69. m_pPalette->CreatePalette(pLogPal);
  70. delete []pLogPal;
  71. dcScreen.SelectPalette(m_pPalette,TRUE);
  72. dcScreen.RealizePalette();
  73. }
  74. // create device dependant bitmap
  75. HBITMAP bitmap = ::CreateDIBitmap(dcScreen.m_hDC, pBitmapInfoHeader, CBM_INIT, pBitmapPictureData, 
  76. pBitmapInfo, DIB_RGB_COLORS);
  77. // attach this new bitmap object to our CBitmap class
  78. Attach(bitmap);
  79. // release dc
  80. ::ReleaseDC(NULL, dcScreen.Detach());
  81. }