|
|
// pictures.cpp : This is the code for the picture object
//
#include "stdafx.h"
#include "resource.h"
#include "pictures.h"
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__; #endif
IMPLEMENT_DYNAMIC( CPic, CDC )
#include "memtrace.h"
/****************************************************************************/
CPic::CPic() : CDC() { mhBitmapOld = NULL; mbReady = FALSE; /*
** set up our DC */ if (! CreateCompatibleDC( NULL )) { #ifdef _DEBUG
OutputDebugString( TEXT("GDI error or unable to get a DC!\r\n") ); #endif
} }
/****************************************************************************/
CPic::~CPic() { if (m_hDC) { if (mhBitmapOld) SelectObject( CBitmap::FromHandle( mhBitmapOld ) );
if (mBitmap.m_hObject) mBitmap.DeleteObject();
if (mMask.m_hObject) mMask.DeleteObject(); } }
/****************************************************************************/
void CPic::Picture( CDC* pDC, int iX, int iY, int iPic ) { if (! mbReady || iPic < 0 || iPic >= miCnt) return;
int iPicX = iPic * mSize.cx;
SelectObject( &mMask );
// select FG color to be Black and BK color to be White
//
// The Default Mono->Color Conversion sets (Black -> FG Color, White -> BG Color)
// It uses FG/BK color from the destination (color DC).
// we want Black -> black, White -> white
// a black/white bitmap in color format.
COLORREF cRefFGColorOld = pDC->SetTextColor( RGB(0,0,0) ); COLORREF cRefBKColorOld = pDC->SetBkColor(RGB(255,255,255));
pDC->BitBlt( iX, iY, mSize.cx, mSize.cy, this, iPicX, 0, SRCAND );
pDC->SetTextColor(cRefFGColorOld); pDC->SetBkColor(cRefBKColorOld);
SelectObject( &mBitmap );
pDC->BitBlt( iX, iY, mSize.cx, mSize.cy, this, iPicX, 0, SRCPAINT ); }
/****************************************************************************/
BOOL CPic::PictureSet( LPCTSTR lpszResourceName, int iCnt ) { BOOL bReturn = FALSE; /*
** get the Pictures bitmap */ if (m_hDC && iCnt) if (mBitmap.LoadBitmap( lpszResourceName )) { miCnt = iCnt;
bReturn = InstallPicture(); } else { #ifdef _DEBUG
OutputDebugString( TEXT("Unable to load the bitmap!\r\n") ); #endif
}
return bReturn; }
/****************************************************************************/
BOOL CPic::PictureSet( UINT nIDResource, int iCnt ) { BOOL bReturn = FALSE; /*
** get the Pictures bitmap */ if (m_hDC && iCnt) if (mBitmap.LoadBitmap( nIDResource )) { miCnt = iCnt;
bReturn = InstallPicture(); } else { #ifdef _DEBUG
OutputDebugString( TEXT("Unable to load the bitmap!\r\n") ); #endif
} return bReturn; }
/****************************************************************************/
BOOL CPic::InstallPicture() { /*
** get the bitmap info from the picture bitmap, saving the picture size */ BITMAP bmInfo;
if (mBitmap.GetObject( sizeof( BITMAP ), &bmInfo ) != sizeof( BITMAP )) { #ifdef _DEBUG
OutputDebugString( TEXT("GDI error getting bitmap information!\r\n") ); #endif
return FALSE; }
mSize = CSize( bmInfo.bmWidth / miCnt, bmInfo.bmHeight ); /*
** put the bitmap in the DC, saving the original. */ CBitmap* bitmap = SelectObject( &mBitmap );
mhBitmapOld = (HBITMAP)bitmap->m_hObject; /*
** create the mask bitmap, same size monochrome */ if (! mMask.CreateBitmap( bmInfo.bmWidth, bmInfo.bmHeight, 1, 1, NULL )) { #ifdef _DEBUG
OutputDebugString( TEXT("GDI error creating the mask bitmap!\r\n") ); #endif
return FALSE; } /*
** put the mask in a temp DC so we can generate the mask bits */ CDC dc;
dc.CreateCompatibleDC( this );
ASSERT( dc.m_hDC );
CBitmap* ob = dc.SelectObject( &mMask ); /*
** use the color at the upper left corner for generating the mask */ SetBkColor( GetPixel( 1, 1 ) );
// this ROP Code will leave bits in the destination bitmap the same color if the
// corresponding source bitmap's bit are black.
// all other bits in the destination (where source bits are not black)
// are turned to black.
#define ROP_DSna 0x00220326L
/*
** Creates the mask from all pixels in the image of a given color. ** Copies to the mask, then cuts the image with the mask. */ // create the mast, All but the background color is Black
// bkcolor is white
dc.BitBlt( 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, this, 0, 0, SRCCOPY );
// select FG color to be Black and BK color to be White
// The Default Mono->Color Conversion sets (Black -> FG Color, White -> BG Color)
// It uses FG/BK color from the destination (color DC).
// we want Black -> black, White -> white
// a black/white bitmap in color format.
COLORREF cRefFGColorOld = dc.SetTextColor( RGB(0,0,0) ); COLORREF cRefBKColorOld = dc.SetBkColor(RGB(255,255,255));
BitBlt( 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, &dc, 0, 0, ROP_DSna );
dc.SetTextColor(cRefFGColorOld); dc.SetBkColor(cRefBKColorOld);
dc.SelectObject( ob ); mbReady = TRUE; return TRUE; }
/****************************************************************************/
|