/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "stdafx.h" #include "imagemap.h" class CNSImageMapFactory : public CGenericFactory { public: CNSImageMapFactory(); ~CNSImageMapFactory(); STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter,REFIID refiid, LPVOID * ppvObj); }; CNSImageMapFactory::CNSImageMapFactory() { ApiApiPtr(api); api->RegisterClassFactory(APICLASS_IMAGEMAP,this); } CNSImageMapFactory::~CNSImageMapFactory() { } STDMETHODIMP CNSImageMapFactory::CreateInstance( LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID * ppvObj) { CNSImageMap * pImageMap = new CNSImageMap; *ppvObj = (LPVOID)((LPUNKNOWN)pImageMap); return NOERROR; } DECLARE_FACTORY(CNSImageMapFactory); //////////////////////////////////////////////////////////////////////// // CNSImageMap implementation CNSImageMap::CNSImageMap() { m_pImageMap = NULL; } CNSImageMap::~CNSImageMap() { ASSERT(m_pImageMap); if (m_pImageMap) delete m_pImageMap; } STDMETHODIMP CNSImageMap::QueryInterface( REFIID refiid, LPVOID * ppv) { *ppv = NULL; if (IsEqualIID(refiid,IID_IImageMap)) *ppv = (LPIMAGEMAP) this; if (*ppv != NULL) { AddRef(); return NOERROR; } return CGenericObject::QueryInterface(refiid,ppv); } int CNSImageMap::Initialize (unsigned int rcid, int width, int height) { m_pImageMap = new CTreeImageMap(rcid,width,height); ASSERT(m_pImageMap); m_pImageMap->Initialize(); return 0; } void CNSImageMap::DrawImage (int index,int x,int y, HDC hDestDC,BOOL bButton) { ASSERT(m_pImageMap); m_pImageMap->DrawImage(index,x,y,hDestDC,bButton); } void CNSImageMap::DrawTransImage (int index,int x,int y, HDC hDestDC ) { ASSERT(m_pImageMap); m_pImageMap->DrawTransImage(index,x,y,hDestDC); } void CNSImageMap::DrawImage (int index,int x,int y,CDC * pDestDC,BOOL bButton) { ASSERT(m_pImageMap); m_pImageMap->DrawImage(index,x,y,pDestDC->GetSafeHdc(),bButton); } void CNSImageMap::DrawTransImage (int index,int x,int y,CDC * pDestDC ) { ASSERT(m_pImageMap); m_pImageMap->DrawTransImage(index,x,y,pDestDC->GetSafeHdc()); } void CNSImageMap::ReInitialize (void) { ASSERT(m_pImageMap); m_pImageMap->ReInitialize(); } void CNSImageMap::UseNormal (void) { ASSERT(m_pImageMap); m_pImageMap->UseNormal(); } void CNSImageMap::UseHighlight (void) { ASSERT(m_pImageMap); m_pImageMap->UseHighlight(); } int CNSImageMap::GetImageHeight (void) { ASSERT(m_pImageMap); return m_pImageMap->GetImageHeight(); } int CNSImageMap::GetImageWidth (void) { ASSERT(m_pImageMap); return m_pImageMap->GetImageWidth(); } unsigned int CNSImageMap::GetResourceID (void) { if (!m_pImageMap) return 0; return m_pImageMap->GetResourceID(); } int CNSImageMap::GetImageCount (void) { ASSERT(m_pImageMap); return m_pImageMap->GetImageCount(); } ////////////////////////////////////////////////////////////////////////////// // CTreeImageMap CTreeImageMap::CTreeImageMap (unsigned int rcid, int width, int height ) { m_iResourceID = rcid; m_iImageWidth = width; m_iImageHeight = height; CreateDefaults ( width, height ); } void CTreeImageMap::CreateDefaults ( int width, int height ) { m_hdcMem = ::CreateCompatibleDC ( NULL ); ::SetBkColor( m_hdcMem, RGB(0xff,0xff,0xff) ); ::SetTextColor( m_hdcMem, RGB(0x00, 0x00, 0x00) ); VERIFY( m_hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(m_iResourceID)) ); BITMAP bm; ::GetObject( m_hBitmap, sizeof(bm), &bm ); m_iBitmapWidth = bm.bmWidth; m_iImageCount = m_iBitmapWidth / width; m_hbmNormal = NULL; m_hbmHighlight = NULL; m_hbmButton = NULL; m_hOriginalBitmap = (HBITMAP)::SelectObject ( m_hdcMem, m_hBitmap ); m_iImageCount = 0; m_iImageWidth = width; m_iImageHeight = height; } CTreeImageMap::~CTreeImageMap ( ) { ::SelectObject ( m_hdcMem, m_hOriginalBitmap ); VERIFY(::DeleteObject(m_hbmNormal)); VERIFY(::DeleteObject(m_hbmHighlight)); VERIFY(::DeleteObject(m_hbmButton)); VERIFY(::DeleteObject(m_hBitmap)); VERIFY(::DeleteDC( m_hdcMem )); } void CTreeImageMap::UseHighlight ( void ) { if ( m_hdcMem ) ::SelectObject( m_hdcMem, m_hbmHighlight ); } void CTreeImageMap::UseNormal ( void ) { if ( m_hdcMem ) ::SelectObject( m_hdcMem, m_hbmNormal ); } void CTreeImageMap::DrawImage ( int idxImage, int x, int y, HDC hDestDC, BOOL bButton ) { HBITMAP hOldBitmap = NULL; if (bButton) hOldBitmap = (HBITMAP) ::SelectObject( m_hdcMem, m_hbmButton); ::BitBlt( hDestDC, x, y, m_iImageWidth, m_iImageHeight, m_hdcMem, idxImage * m_iImageWidth, 0, SRCCOPY ); if ( hOldBitmap ) ::SelectObject( m_hdcMem, hOldBitmap ); } void CTreeImageMap::DrawTransImage ( int idxImage, int x, int y, HDC hDstDC ) { HBITMAP hOldBitmap = (HBITMAP) ::SelectObject( m_hdcMem, m_hBitmap ); ::FEU_TransBlt( hDstDC, x, y, m_iImageWidth, m_iImageHeight, m_hdcMem, idxImage * m_iImageWidth, 0 ,WFE_GetUIPalette(NULL)); if (hOldBitmap) SelectObject( m_hdcMem, hOldBitmap ); } int CTreeImageMap::InitializeImage ( HBITMAP hImage ) { if (m_hdcMem && m_hBitmap) { // main color bitmap HDC hMemDC = ::CreateCompatibleDC ( m_hdcMem ); HBITMAP hOldBitmap = (HBITMAP) ::SelectObject ( hMemDC, hImage ); ::BitBlt ( m_hdcMem, 0, 0, m_iImageWidth, m_iImageHeight, hMemDC, 0, 0, SRCCOPY ); ::SelectObject ( hMemDC, hOldBitmap ); } return 0; } void CTreeImageMap::Initialize ( void ) { HDC hdcMem, hdcDest; RECT rect; ::SetRect( &rect, 0, 0, m_iBitmapWidth, m_iImageHeight ); HBRUSH hBrush = ::CreateSolidBrush( GetSysColor ( COLOR_WINDOW ) ), hOldBrush; HPEN hPen = ::CreatePen( PS_SOLID, 1, GetSysColor ( COLOR_WINDOW ) ), hOldPen; HBRUSH hHighBrush = ::CreateSolidBrush( GetSysColor ( COLOR_HIGHLIGHT ) ); HPEN hHighPen = ::CreatePen( PS_SOLID, 1, GetSysColor ( COLOR_HIGHLIGHT ) ); HBRUSH hButtonBrush = ::CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); HPEN hButtonPen = ::CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNFACE)); m_hbmNormal = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight ); m_hbmHighlight = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight ); m_hbmButton = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight ); HBITMAP hbmSrc = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight ); hdcMem = ::CreateCompatibleDC( m_hdcMem ); hdcDest = ::CreateCompatibleDC( m_hdcMem ); ::SetBkColor( hdcMem, RGB(0xff,0xff,0xff) ); ::SetBkColor( hdcDest, RGB(0xff,0xff,0xff) ); ::SetTextColor( hdcMem, RGB(0x00,0x00,0x00) ); ::SetTextColor( hdcDest, RGB(0x00,0x00,0x00) ); HBITMAP hbmMask = ::CreateBitmap ( m_iBitmapWidth, m_iImageHeight, 1, 1, NULL ); // create the mask bitmap... HBITMAP hOld = (HBITMAP) SelectObject( m_hdcMem, hbmMask ); HBITMAP hbmOldMem = (HBITMAP) ::SelectObject( hdcMem, m_hBitmap ); COLORREF cOld = ::SetBkColor ( hdcMem, RGB(255,0,255) ); ::BitBlt( m_hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); ::SelectObject( m_hdcMem, hbmSrc ); ::BitBlt( m_hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, SRCCOPY ); ::SetBkColor ( hdcMem, cOld ); ::SelectObject( hdcMem, hbmOldMem ); // end mask // create the normal (unactive highlight bar) HBITMAP hbmOldDest = (HBITMAP) ::SelectObject( hdcDest, m_hbmNormal ); hOldBrush = (HBRUSH) ::SelectObject( hdcDest, hBrush ); hOldPen = (HPEN) ::SelectObject( hdcDest, hPen ); ::Rectangle( hdcDest, rect.left, rect.top, rect.right, rect.bottom ); hbmOldMem = (HBITMAP) ::SelectObject( hdcMem, hbmMask ); // replace pink with black ::BitBlt( m_hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, SRCAND ); // invert mask ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); // background ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, SRCAND ); // invert again ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, m_hdcMem, 0, 0, SRCPAINT ); // create the highlight bar ::SelectObject( hdcDest, m_hbmHighlight ); ::SelectObject( hdcDest, hHighBrush ); ::SelectObject( hdcDest, hHighPen ); ::Rectangle( hdcDest, rect.left, rect.top, rect.right, rect.bottom ); // invert mask ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); // background ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, SRCAND ); // invert again ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, m_hdcMem, 0, 0, SRCPAINT ); // create the button bar ::SelectObject( hdcDest, m_hbmButton ); ::SelectObject( hdcDest, hButtonBrush ); ::SelectObject( hdcDest, hButtonPen ); ::Rectangle( hdcDest, rect.left, rect.top, rect.right, rect.bottom ); // invert mask ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); // background ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, SRCAND ); // invert again ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, hdcMem, 0, 0, NOTSRCCOPY ); ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, m_hdcMem, 0, 0, SRCPAINT ); ::SelectObject( hdcDest, hOldBrush ); ::SelectObject( hdcDest, hOldPen ); ::SelectObject( hdcDest, hbmOldDest ); ::SelectObject( hdcMem, hbmOldMem ); ::SelectObject( m_hdcMem, hOld ); ::SelectObject( m_hdcMem, m_hbmNormal ); VERIFY(::DeleteObject( hBrush )); VERIFY(::DeleteObject( hPen )); VERIFY(::DeleteObject( hHighBrush )); VERIFY(::DeleteObject( hHighPen )); VERIFY(::DeleteObject( hButtonBrush )); VERIFY(::DeleteObject( hButtonPen )); VERIFY(::DeleteObject( hbmSrc )); VERIFY(::DeleteObject( hbmMask )); VERIFY(::DeleteDC( hdcMem )); VERIFY(::DeleteDC( hdcDest )); } void CTreeImageMap::ReInitialize ( void ) { ::SelectObject ( m_hdcMem, m_hOriginalBitmap ); if ( m_hbmNormal ) { VERIFY(::DeleteObject(m_hbmNormal)); m_hbmNormal = NULL; } if ( m_hbmHighlight ) { VERIFY(::DeleteObject(m_hbmHighlight)); m_hbmHighlight = NULL; } if ( m_hbmButton ) { VERIFY(::DeleteObject(m_hbmButton)); m_hbmButton = NULL; } if ( m_hBitmap ) { VERIFY(::DeleteObject(m_hBitmap)); m_hBitmap = NULL; } VERIFY(::DeleteDC( m_hdcMem )); CreateDefaults ( m_iImageWidth, m_iImageHeight ); Initialize(); }