BackgroundUtil.cpp
上传用户:yangxun008
上传日期:2008-03-25
资源大小:3863k
文件大小:3k
- #include "stdafx.h"
- #include "BackgroundUtil.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CBackgroundUtil::CBackgroundUtil()
- {
- }
- CBackgroundUtil::~CBackgroundUtil()
- {
- m_BmpPattern.Detach();
- m_BmpPalette.Detach();
- }
- BOOL CBackgroundUtil::SetBitmap(UINT uResourceID)
- {
- BITMAP bm;
- BOOL bRet;
- // Detach previous resources
- m_BmpPattern.Detach();
- m_BmpPalette.Detach();
- // Default return value
- bRet = TRUE;
- // Load new bitmap
- if (uResourceID != 0)
- {
- bRet = GetBitmapAndPalette(uResourceID, m_BmpPattern, m_BmpPalette);
- // If all ok
- if (bRet == TRUE)
- {
- // Get dimension
- m_BmpPattern.GetBitmap(&bm);
- // Width of the bitmap
- m_nBmpWidth = bm.bmWidth;
- // Height of the bitmap
- m_nBmpHeight = bm.bmHeight;
- }
- }
- return bRet;
- } // End of SetBitmap
- BOOL CBackgroundUtil::GetBitmapAndPalette(UINT nIDResource, CBitmap & bitmap, CPalette & pal)
- {
- LPCTSTR lpszResourceName = (LPCTSTR)nIDResource;
- HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
- lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION);
- if (hBmp == NULL) return FALSE;
- bitmap.Attach(hBmp);
- // Create a logical palette for the bitmap
- DIBSECTION ds;
- BITMAPINFOHEADER &bmInfo = ds.dsBmih;
- bitmap.GetObject(sizeof(ds), &ds);
- int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
- // Create a halftone palette if colors > 256.
- CClientDC dc(NULL); // Desktop DC
- if(nColors > 256)
- pal.CreateHalftonePalette(&dc);
- else
- {
- // Create the palette
- RGBQUAD *pRGB = new RGBQUAD[nColors];
- CDC memDC;
- memDC.CreateCompatibleDC(&dc);
- memDC.SelectObject( &bitmap );
- ::GetDIBColorTable( memDC, 0, nColors, pRGB );
- UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
- LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
- pLP->palVersion = 0x300;
- pLP->palNumEntries = nColors;
- for (int i=0; i < nColors; i++)
- {
- pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
- pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
- pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
- pLP->palPalEntry[i].peFlags = 0;
- }
- pal.CreatePalette( pLP );
- delete[] pLP;
- delete[] pRGB;
- }
- return TRUE;
- } // End of GetBitmapAndPalette
- BOOL CBackgroundUtil::TileBitmap(CDC* pDC, CRect rc)
- {
- CDC MemDC;
- int x = 0, y = 0;
- // If there is a bitmap loaded
- if (m_BmpPattern.m_hObject != NULL)
- {
- MemDC.CreateCompatibleDC(pDC);
- CBitmap* pOldBitmap = MemDC.SelectObject(&m_BmpPattern);
- // Tile the bitmap
- while (y < rc.Height())
- {
- while(x < rc.Width())
- {
- pDC->BitBlt(x, y, m_nBmpWidth, m_nBmpHeight, &MemDC, 0, 0, SRCCOPY);
- x += m_nBmpWidth;
- }
- x = 0;
- y += m_nBmpHeight;
- }
- MemDC.SelectObject(pOldBitmap);
- return TRUE;
- }
- return FALSE; // Normal behaviour
- } // End of TileBitmap