www.pudn.com > XAnalogClock_demo.zip > CDCBuffer.h
#ifndef CDCBUFFER_H
#define CDCBUFFER_H
class CDCBuffer
{
public:
CDCBuffer()
{
m_bValid = FALSE;
m_hOldBitmap = NULL;
m_hBitmap = NULL;
m_nBitmapID = 0;
m_sizeBitmap.cx = m_sizeBitmap.cy = 0;
}
~CDCBuffer()
{
DeleteObject();
}
void DeleteObject()
{
if (m_hOldBitmap)
m_dcMemory.SelectObject(m_hOldBitmap);
m_hOldBitmap = NULL;
if (m_hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = NULL;
m_bValid = FALSE;
}
BOOL LoadBitmap(UINT nBitmapID, CDC * pDC)
{
TRACE(_T("in CDCBuffer::LoadBitmap for %d\n"), nBitmapID);
BOOL ok = FALSE;
DeleteObject();
ASSERT(pDC);
ASSERT(nBitmapID);
HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nBitmapID), RT_BITMAP);
m_hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmapID),
IMAGE_BITMAP, 0, 0, 0);
ASSERT(m_hBitmap);
if (m_hBitmap && pDC)
{
m_dcMemory.DeleteDC();
if (m_dcMemory.CreateCompatibleDC(pDC))
{
m_hOldBitmap = (HBITMAP)::SelectObject(m_dcMemory.m_hDC, m_hBitmap);
m_nBitmapID = nBitmapID;
m_bValid = TRUE;
m_sizeBitmap.cx = m_sizeBitmap.cy = 0;
BITMAP bm;
if (GetBitmap(&bm))
{
m_sizeBitmap.cx = bm.bmWidth;
m_sizeBitmap.cy = bm.bmHeight;
TRACE(_T("bitmap size = %d,%d\n"), m_sizeBitmap.cx, m_sizeBitmap.cy);
}
else
{
TRACE(_T("ERROR - GetBitmap failed\n"));
}
ok = TRUE;
}
else
{
TRACE(_T("ERROR - CreateCompatibleDC failed\n"));
}
}
return ok;
}
BOOL AttachBitmap(HBITMAP hBitmap, CDC * pDC)
{
BOOL ok = FALSE;
DeleteObject();
ASSERT(hBitmap);
m_hBitmap = hBitmap;
if (m_hBitmap && pDC)
{
m_dcMemory.DeleteDC();
if (m_dcMemory.CreateCompatibleDC(pDC))
{
m_hOldBitmap = (HBITMAP)::SelectObject(m_dcMemory.m_hDC, m_hBitmap);
m_nBitmapID = 0;
m_bValid = TRUE;
ok = TRUE;
}
}
return ok;
}
BOOL GetBitmap(BITMAP * pBM)
{
BOOL ok = FALSE;
if (m_bValid && m_hBitmap)
{
ok = ::GetObject(m_hBitmap, sizeof(BITMAP), pBM);
}
return ok;
}
BOOL IsValid()
{
return m_bValid;
}
CDC m_dcMemory;
HBITMAP m_hBitmap;
CSize m_sizeBitmap;
protected:
BOOL m_bValid;
HBITMAP m_hOldBitmap;
UINT m_nBitmapID;
};
#endif //CDCBUFFER_H