gecko-dev/cmd/winfe/imagemap.cpp
1998-03-28 02:44:41 +00:00

415 lines
11 KiB
C++
Executable File

/* -*- 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();
}