|
|
#include "stdafx.h"
#include "pbrush.h"
#include "pbrusdoc.h"
#include "pbrusfrm.h"
#include "bmobject.h"
#include "imgsuprt.h"
#include "imgwnd.h"
#include "imgwell.h"
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__; #endif
#include "memtrace.h"
#define DSx 0x00660046L
#define DSna 0x00220326L
CImageWell::CImageWell() : m_bitmap(), m_dc(), m_mask(), m_maskDC(), m_imageSize(0, 0) { m_nBitmapID = 0; }
CImageWell::CImageWell(UINT nBitmapID, CSize imageSize) : m_bitmap(), m_dc(), m_mask(), m_maskDC(), m_imageSize(imageSize) { m_nBitmapID = nBitmapID; }
CImageWell::~CImageWell() { // Destructor needed to ensure the DC is deleted before the bitmap
m_dc.DeleteDC(); m_bitmap.DeleteObject(); m_maskDC.DeleteDC(); m_mask.DeleteObject(); }
BOOL CImageWell::Load(UINT nBitmapID, CSize imageSize) { ASSERT(m_bitmap.m_hObject == NULL);
if (!m_bitmap.LoadBitmap(nBitmapID)) { TRACE1("Could not load image well %d\n", nBitmapID); return FALSE; }
m_nBitmapID = nBitmapID; m_imageSize = imageSize;
return TRUE; }
void CImageWell::Unload() { ASSERT(m_dc.m_hDC == NULL); // can't unload if it's open!
ASSERT(m_maskDC.m_hDC == NULL); ASSERT(m_bitmap.m_hObject != NULL);
m_bitmap.DeleteObject(); m_mask.DeleteObject(); }
BOOL CImageWell::CalculateMask() { ASSERT(m_maskDC.m_hDC == NULL); ASSERT(m_dc.m_hDC != NULL); ASSERT(m_bitmap.m_hObject != NULL);
if (!m_maskDC.CreateCompatibleDC(NULL)) { theApp.SetGdiEmergency(FALSE); return FALSE; }
if (m_mask.m_hObject != NULL) { VERIFY(m_maskDC.SelectObject(&m_mask) != NULL); return TRUE; }
BITMAP bmp; m_bitmap.GetObject(sizeof (BITMAP), &bmp);
if (!m_mask.CreateBitmap(bmp.bmWidth, bmp.bmHeight*2, 1, 1, NULL)) { m_maskDC.DeleteDC(); theApp.SetMemoryEmergency(FALSE); return FALSE; }
VERIFY(m_maskDC.SelectObject(&m_mask) != NULL);
COLORREF oldBkColor = m_dc.SetBkColor(m_dc.GetPixel(0, 0)); m_maskDC.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &m_dc, 0, 0, NOTSRCCOPY); // store the pixels in "button text" color in the second part of the mask
m_dc.SetBkColor(RGB(0, 0, 0)); m_maskDC.BitBlt(0, bmp.bmHeight, bmp.bmWidth, bmp.bmHeight, &m_dc, 0, 0, SRCCOPY); m_dc.SetBkColor(oldBkColor);
return TRUE; }
BOOL CImageWell::Open() { ASSERT(m_dc.m_hDC == NULL); // make sure this is not already open
ASSERT(m_nBitmapID != 0);
if (m_bitmap.m_hObject == NULL && !Load(m_nBitmapID, m_imageSize)) return FALSE;
if (!m_dc.CreateCompatibleDC(NULL)) { theApp.SetGdiEmergency(FALSE); return FALSE; }
VERIFY(m_dc.SelectObject(&m_bitmap));
return TRUE; }
void CImageWell::Close() { ASSERT(m_dc.m_hDC != NULL);
m_dc.DeleteDC(); m_maskDC.DeleteDC(); }
BOOL CImageWell::DrawImage(CDC* pDestDC, CPoint destPoint, UINT nImage, DWORD rop) { BOOL bClose = FALSE; if (m_dc.m_hDC == NULL) { ASSERT(rop != NULL); // must open first and calc mask for rop==0!
if (!Open()) { TRACE(TEXT("Could not open image well!\n")); return FALSE; }
bClose = TRUE; }
if (rop == 0) { if (m_maskDC.m_hDC == NULL && !CalculateMask()) return FALSE;
COLORREF oldBkColor = pDestDC->SetBkColor(RGB(255, 255, 255)); COLORREF oldTextColor = pDestDC->SetTextColor(RGB(0, 0, 0));
pDestDC->BitBlt(destPoint.x, destPoint.y, m_imageSize.cx, m_imageSize.cy, &m_dc, m_imageSize.cx * nImage, 0, DSx);
pDestDC->BitBlt(destPoint.x, destPoint.y, m_imageSize.cx, m_imageSize.cy, &m_maskDC, m_imageSize.cx * nImage, 0, DSna);
pDestDC->BitBlt(destPoint.x, destPoint.y, m_imageSize.cx, m_imageSize.cy, &m_dc, m_imageSize.cx * nImage, 0, DSx);
pDestDC->SetBkColor(GetSysColor(COLOR_BTNTEXT));
pDestDC->BitBlt(destPoint.x, destPoint.y, m_imageSize.cx, m_imageSize.cy, &m_maskDC, m_imageSize.cx * nImage, m_imageSize.cy, SRCPAINT);
pDestDC->SetBkColor(oldBkColor); pDestDC->SetTextColor(oldTextColor); } else { pDestDC->BitBlt(destPoint.x, destPoint.y, m_imageSize.cx, m_imageSize.cy, &m_dc, m_imageSize.cx * nImage, 0, rop); }
if (bClose) Close();
return TRUE; }
|