home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / winfe / imagemap.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  11.8 KB  |  415 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18.  
  19. #include "stdafx.h"
  20. #include "imagemap.h"
  21.  
  22.  
  23. class CNSImageMapFactory :  public  CGenericFactory
  24. {
  25. public:
  26.     CNSImageMapFactory();
  27.     ~CNSImageMapFactory();
  28.     STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter,REFIID refiid, LPVOID * ppvObj);
  29. };
  30.  
  31. CNSImageMapFactory::CNSImageMapFactory()
  32. {
  33.     ApiApiPtr(api);
  34.     api->RegisterClassFactory(APICLASS_IMAGEMAP,this);
  35. }
  36.  
  37. CNSImageMapFactory::~CNSImageMapFactory()
  38. {
  39. }
  40.  
  41. STDMETHODIMP CNSImageMapFactory::CreateInstance(
  42.     LPUNKNOWN pUnkOuter,
  43.     REFIID refiid,
  44.     LPVOID * ppvObj)
  45. {
  46.     CNSImageMap * pImageMap = new CNSImageMap;
  47.     *ppvObj = (LPVOID)((LPUNKNOWN)pImageMap);
  48.     return NOERROR;
  49. }
  50.  
  51. DECLARE_FACTORY(CNSImageMapFactory);
  52.  
  53. ////////////////////////////////////////////////////////////////////////
  54. // CNSImageMap implementation
  55.  
  56. CNSImageMap::CNSImageMap()
  57. {
  58.     m_pImageMap = NULL;
  59. }
  60.  
  61. CNSImageMap::~CNSImageMap()
  62. {
  63.     ASSERT(m_pImageMap);
  64.     if (m_pImageMap)
  65.         delete m_pImageMap;
  66. }
  67.  
  68.  
  69. STDMETHODIMP CNSImageMap::QueryInterface(
  70.    REFIID refiid,
  71.    LPVOID * ppv)
  72. {
  73.     *ppv = NULL;
  74.  
  75.     if (IsEqualIID(refiid,IID_IImageMap))
  76.         *ppv = (LPIMAGEMAP) this;
  77.  
  78.     if (*ppv != NULL) {
  79.            AddRef();
  80.         return NOERROR;
  81.     }
  82.  
  83.     return CGenericObject::QueryInterface(refiid,ppv);
  84. }
  85.  
  86.  
  87. int CNSImageMap::Initialize (unsigned int rcid, int width, int height)
  88. {
  89.     m_pImageMap = new CTreeImageMap(rcid,width,height);
  90.     ASSERT(m_pImageMap);
  91.     m_pImageMap->Initialize();
  92.     return 0;
  93. }
  94.  
  95. void CNSImageMap::DrawImage (int index,int x,int y, HDC hDestDC,BOOL bButton)
  96. {
  97.     ASSERT(m_pImageMap);
  98.     m_pImageMap->DrawImage(index,x,y,hDestDC,bButton);
  99. }
  100.  
  101. void CNSImageMap::DrawTransImage (int index,int x,int y, HDC hDestDC )
  102. {
  103.     ASSERT(m_pImageMap);
  104.     m_pImageMap->DrawTransImage(index,x,y,hDestDC);
  105. }
  106.  
  107. void CNSImageMap::DrawImage (int index,int x,int y,CDC * pDestDC,BOOL bButton)
  108. {
  109.     ASSERT(m_pImageMap);
  110.     m_pImageMap->DrawImage(index,x,y,pDestDC->GetSafeHdc(),bButton);
  111. }
  112.  
  113. void CNSImageMap::DrawTransImage (int index,int x,int y,CDC * pDestDC )
  114. {
  115.     ASSERT(m_pImageMap);
  116.     m_pImageMap->DrawTransImage(index,x,y,pDestDC->GetSafeHdc());
  117. }
  118.  
  119. void CNSImageMap::ReInitialize (void)
  120. {
  121.     ASSERT(m_pImageMap);
  122.     m_pImageMap->ReInitialize();
  123. }
  124.  
  125. void CNSImageMap::UseNormal (void)
  126. {
  127.     ASSERT(m_pImageMap);
  128.     m_pImageMap->UseNormal();
  129. }
  130.  
  131. void CNSImageMap::UseHighlight (void)
  132. {
  133.     ASSERT(m_pImageMap);
  134.     m_pImageMap->UseHighlight();
  135. }
  136.  
  137.  
  138. int CNSImageMap::GetImageHeight (void)
  139. {
  140.     ASSERT(m_pImageMap);
  141.     return m_pImageMap->GetImageHeight();
  142. }
  143.  
  144. int CNSImageMap::GetImageWidth (void)
  145. {
  146.     ASSERT(m_pImageMap);
  147.     return m_pImageMap->GetImageWidth();
  148. }
  149.  
  150. unsigned int CNSImageMap::GetResourceID (void)
  151. {
  152.     if (!m_pImageMap)
  153.         return 0;
  154.     return m_pImageMap->GetResourceID();
  155. }
  156.  
  157. int CNSImageMap::GetImageCount (void)
  158. {
  159.     ASSERT(m_pImageMap);
  160.     return m_pImageMap->GetImageCount();
  161. }
  162.  
  163. //////////////////////////////////////////////////////////////////////////////
  164. // CTreeImageMap
  165.  
  166. CTreeImageMap::CTreeImageMap (unsigned int rcid, int width, int height )
  167. {
  168.     m_iResourceID = rcid;
  169.     m_iImageWidth = width;
  170.     m_iImageHeight = height;
  171.     CreateDefaults ( width, height );
  172.     
  173. }
  174.  
  175. void CTreeImageMap::CreateDefaults ( int width, int height )
  176. {
  177.     m_hdcMem = ::CreateCompatibleDC ( NULL );
  178.     ::SetBkColor( m_hdcMem, RGB(0xff,0xff,0xff) );
  179.     ::SetTextColor( m_hdcMem, RGB(0x00, 0x00, 0x00) );
  180.  
  181.     VERIFY( m_hBitmap = ::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(m_iResourceID)) );
  182.     BITMAP bm;
  183.     ::GetObject( m_hBitmap, sizeof(bm), &bm );
  184.     m_iBitmapWidth = bm.bmWidth;
  185.     m_iImageCount  = m_iBitmapWidth / width;
  186.  
  187.     m_hbmNormal = NULL;
  188.     m_hbmHighlight = NULL;
  189.     m_hbmButton = NULL;
  190.     m_hOriginalBitmap = (HBITMAP)::SelectObject ( m_hdcMem, m_hBitmap );
  191.     m_iImageCount = 0;
  192.  
  193.     m_iImageWidth =  width;  
  194.     m_iImageHeight = height;
  195. }
  196.  
  197. CTreeImageMap::~CTreeImageMap ( )
  198. {
  199.     ::SelectObject ( m_hdcMem, m_hOriginalBitmap );
  200.     VERIFY(::DeleteObject(m_hbmNormal));
  201.     VERIFY(::DeleteObject(m_hbmHighlight));
  202.     VERIFY(::DeleteObject(m_hbmButton));
  203.     VERIFY(::DeleteObject(m_hBitmap));
  204.  
  205.     VERIFY(::DeleteDC( m_hdcMem ));
  206. }
  207.  
  208. void CTreeImageMap::UseHighlight ( void ) 
  209. {
  210.     if ( m_hdcMem )
  211.         ::SelectObject( m_hdcMem, m_hbmHighlight );
  212. }
  213.  
  214. void CTreeImageMap::UseNormal ( void ) 
  215. {
  216.     if ( m_hdcMem )
  217.         ::SelectObject( m_hdcMem, m_hbmNormal );
  218. }
  219.  
  220. void CTreeImageMap::DrawImage ( int idxImage, int x, int y, HDC hDestDC, BOOL bButton )
  221. {
  222.     HBITMAP hOldBitmap = NULL;
  223.     if (bButton) 
  224.         hOldBitmap = (HBITMAP) ::SelectObject( m_hdcMem, m_hbmButton);
  225.  
  226.     ::BitBlt( hDestDC, x, y, m_iImageWidth, m_iImageHeight, 
  227.               m_hdcMem, idxImage * m_iImageWidth, 0, SRCCOPY );
  228.     
  229.     if ( hOldBitmap ) 
  230.         ::SelectObject( m_hdcMem, hOldBitmap );
  231. }
  232.  
  233. void CTreeImageMap::DrawTransImage ( int idxImage, int x, int y, HDC hDstDC )
  234. {
  235.     HBITMAP hOldBitmap = (HBITMAP) ::SelectObject( m_hdcMem, m_hBitmap );
  236.  
  237.     ::FEU_TransBlt( hDstDC, x, y, m_iImageWidth, m_iImageHeight,
  238.                     m_hdcMem, idxImage * m_iImageWidth, 0 ,WFE_GetUIPalette(NULL));
  239.  
  240.     if (hOldBitmap) 
  241.         SelectObject( m_hdcMem, hOldBitmap );
  242. }
  243.  
  244. int CTreeImageMap::InitializeImage ( HBITMAP hImage )
  245. {
  246.     if (m_hdcMem && m_hBitmap)
  247.     {
  248.         // main color bitmap
  249.         HDC hMemDC = ::CreateCompatibleDC ( m_hdcMem );
  250.         HBITMAP hOldBitmap = (HBITMAP) ::SelectObject ( hMemDC, hImage );
  251.         ::BitBlt ( m_hdcMem, 0, 0, m_iImageWidth, m_iImageHeight, hMemDC, 0, 0, SRCCOPY );
  252.         ::SelectObject ( hMemDC, hOldBitmap );
  253.     } 
  254.     return 0;
  255. }
  256.  
  257. void CTreeImageMap::Initialize ( void )
  258. {
  259.     HDC hdcMem, hdcDest;
  260.     RECT rect;
  261.     ::SetRect( &rect, 0, 0, m_iBitmapWidth, m_iImageHeight );
  262.  
  263.     HBRUSH hBrush = ::CreateSolidBrush( GetSysColor ( COLOR_WINDOW ) ), hOldBrush;
  264.     HPEN hPen = ::CreatePen( PS_SOLID, 1, GetSysColor ( COLOR_WINDOW ) ), hOldPen;
  265.     HBRUSH hHighBrush = ::CreateSolidBrush( GetSysColor ( COLOR_HIGHLIGHT ) );
  266.     HPEN hHighPen = ::CreatePen( PS_SOLID, 1, GetSysColor ( COLOR_HIGHLIGHT ) );
  267.     HBRUSH hButtonBrush = ::CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  268.     HPEN hButtonPen = ::CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNFACE));
  269.  
  270.     m_hbmNormal = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight );
  271.     m_hbmHighlight = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight );
  272.     m_hbmButton = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight );
  273.  
  274.     HBITMAP hbmSrc = ::CreateCompatibleBitmap( m_hdcMem, m_iBitmapWidth, m_iImageHeight );
  275.  
  276.     hdcMem = ::CreateCompatibleDC( m_hdcMem );
  277.     hdcDest = ::CreateCompatibleDC( m_hdcMem );
  278.     ::SetBkColor( hdcMem, RGB(0xff,0xff,0xff) );
  279.     ::SetBkColor( hdcDest, RGB(0xff,0xff,0xff) );
  280.     ::SetTextColor( hdcMem, RGB(0x00,0x00,0x00) );
  281.     ::SetTextColor( hdcDest, RGB(0x00,0x00,0x00) );
  282.  
  283.     HBITMAP hbmMask = ::CreateBitmap ( m_iBitmapWidth, m_iImageHeight, 1, 1, NULL );
  284.  
  285.     // create the mask bitmap...
  286.     HBITMAP hOld = (HBITMAP) SelectObject( m_hdcMem, hbmMask );
  287.     HBITMAP hbmOldMem = (HBITMAP) ::SelectObject( hdcMem,  m_hBitmap );
  288.     COLORREF cOld = ::SetBkColor ( hdcMem, RGB(255,0,255) );
  289.     ::BitBlt( m_hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  290.               hdcMem, 0, 0, NOTSRCCOPY );
  291.     ::SelectObject( m_hdcMem, hbmSrc );
  292.     ::BitBlt( m_hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  293.               hdcMem, 0, 0, SRCCOPY );
  294.     ::SetBkColor ( hdcMem, cOld );
  295.     ::SelectObject( hdcMem,  hbmOldMem );
  296.     // end mask
  297.  
  298.     // create the normal (unactive highlight bar)
  299.     HBITMAP hbmOldDest = (HBITMAP) ::SelectObject( hdcDest,  m_hbmNormal );
  300.     hOldBrush = (HBRUSH) ::SelectObject( hdcDest,  hBrush );
  301.     hOldPen = (HPEN) ::SelectObject( hdcDest,  hPen );
  302.     ::Rectangle( hdcDest, rect.left, rect.top, rect.right, rect.bottom );
  303.  
  304.     hbmOldMem = (HBITMAP) ::SelectObject( hdcMem,  hbmMask );
  305.  
  306.     // replace pink with black
  307.     ::BitBlt( m_hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  308.               hdcMem, 0, 0, SRCAND );
  309.  
  310.     // invert mask
  311.     ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  312.               hdcMem, 0, 0, NOTSRCCOPY );
  313.  
  314.     // background
  315.     ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  316.               hdcMem, 0, 0, SRCAND );
  317.  
  318.     // invert again
  319.     ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  320.               hdcMem, 0, 0, NOTSRCCOPY );
  321.  
  322.     ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  323.               m_hdcMem, 0, 0, SRCPAINT );
  324.  
  325.     // create the highlight bar
  326.     ::SelectObject( hdcDest,  m_hbmHighlight );
  327.     ::SelectObject( hdcDest,  hHighBrush );
  328.     ::SelectObject( hdcDest,  hHighPen );
  329.     ::Rectangle( hdcDest, rect.left, rect.top, rect.right, rect.bottom );
  330.  
  331.     // invert mask
  332.     ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  333.               hdcMem, 0, 0, NOTSRCCOPY );
  334.  
  335.     // background
  336.     ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight,
  337.               hdcMem, 0, 0, SRCAND );
  338.  
  339.     // invert again
  340.     ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  341.               hdcMem, 0, 0, NOTSRCCOPY );
  342.  
  343.     ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  344.               m_hdcMem, 0, 0, SRCPAINT );
  345.  
  346.     // create the button bar
  347.     ::SelectObject( hdcDest,  m_hbmButton );
  348.     ::SelectObject( hdcDest,  hButtonBrush );
  349.     ::SelectObject( hdcDest,  hButtonPen );
  350.     ::Rectangle( hdcDest, rect.left, rect.top, rect.right, rect.bottom );
  351.  
  352.     // invert mask
  353.     ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight,
  354.               hdcMem, 0, 0, NOTSRCCOPY );
  355.  
  356.     // background
  357.     ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  358.               hdcMem, 0, 0, SRCAND );
  359.  
  360.     // invert again
  361.     ::BitBlt( hdcMem, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  362.               hdcMem, 0, 0, NOTSRCCOPY );
  363.  
  364.     ::BitBlt( hdcDest, 0, 0, m_iBitmapWidth, m_iImageHeight, 
  365.               m_hdcMem, 0, 0, SRCPAINT );
  366.  
  367.     ::SelectObject( hdcDest,  hOldBrush );
  368.     ::SelectObject( hdcDest,  hOldPen );
  369.     ::SelectObject( hdcDest,  hbmOldDest );
  370.     ::SelectObject( hdcMem,  hbmOldMem );
  371.  
  372.     ::SelectObject( m_hdcMem, hOld );
  373.     ::SelectObject( m_hdcMem, m_hbmNormal );
  374.  
  375.     VERIFY(::DeleteObject( hBrush ));
  376.     VERIFY(::DeleteObject( hPen ));
  377.     VERIFY(::DeleteObject( hHighBrush ));
  378.     VERIFY(::DeleteObject( hHighPen ));
  379.     VERIFY(::DeleteObject( hButtonBrush ));
  380.     VERIFY(::DeleteObject( hButtonPen ));
  381.  
  382.     VERIFY(::DeleteObject( hbmSrc ));
  383.     VERIFY(::DeleteObject( hbmMask ));
  384.  
  385.     VERIFY(::DeleteDC( hdcMem ));
  386.     VERIFY(::DeleteDC( hdcDest ));
  387. }
  388.  
  389. void CTreeImageMap::ReInitialize ( void )
  390. {
  391.     ::SelectObject ( m_hdcMem, m_hOriginalBitmap );
  392.  
  393.     if ( m_hbmNormal ) {
  394.         VERIFY(::DeleteObject(m_hbmNormal));
  395.         m_hbmNormal = NULL;
  396.     }
  397.     if ( m_hbmHighlight ) {
  398.         VERIFY(::DeleteObject(m_hbmHighlight));
  399.         m_hbmHighlight = NULL;
  400.     }
  401.     if ( m_hbmButton ) {
  402.         VERIFY(::DeleteObject(m_hbmButton));
  403.         m_hbmButton = NULL;
  404.     }
  405.     if ( m_hBitmap ) {
  406.         VERIFY(::DeleteObject(m_hBitmap));
  407.         m_hBitmap = NULL;
  408.     }
  409.  
  410.     VERIFY(::DeleteDC( m_hdcMem ));
  411.  
  412.     CreateDefaults ( m_iImageWidth, m_iImageHeight );
  413.     Initialize();
  414. }
  415.