home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / shell / regview / extricon.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-27  |  5.5 KB  |  220 lines

  1. /**************************************************************************
  2.    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3.    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4.    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5.    PARTICULAR PURPOSE.
  6.  
  7.    Copyright 1997 Microsoft Corporation.  All Rights Reserved.
  8. **************************************************************************/
  9.  
  10. /**************************************************************************
  11.  
  12.    File:          ExtrIcon.cpp
  13.    
  14.    Description:   Implements CExtractIcon.
  15.  
  16. **************************************************************************/
  17.  
  18. /**************************************************************************
  19.    #include statements
  20. **************************************************************************/
  21.  
  22. #include "ExtrIcon.h"
  23.  
  24. /**************************************************************************
  25.  
  26.    CExtractIcon::CExtractIcon()
  27.  
  28. **************************************************************************/
  29.  
  30. CExtractIcon::CExtractIcon(LPCITEMIDLIST pidl)
  31. {
  32. m_pPidlMgr = new CPidlMgr();
  33. if(!m_pPidlMgr)
  34.    {
  35.    delete this;
  36.    return;
  37.    }
  38.  
  39. m_pidl = m_pPidlMgr->Copy(pidl);
  40.  
  41. m_ObjRefCount = 1;
  42.  
  43. g_DllRefCount++;
  44. }
  45.  
  46. /**************************************************************************
  47.  
  48.    CExtractIcon::~CExtractIcon()
  49.  
  50. **************************************************************************/
  51.  
  52. CExtractIcon::~CExtractIcon()
  53. {
  54. if(m_pidl)
  55.    {
  56.    m_pPidlMgr->Delete(m_pidl);
  57.    m_pidl = NULL;
  58.    }
  59.  
  60. if(m_pPidlMgr)
  61.    {
  62.    delete m_pPidlMgr;
  63.    }
  64.  
  65. g_DllRefCount--;
  66. }
  67.  
  68. ///////////////////////////////////////////////////////////////////////////
  69. //
  70. // IUnknown Implementation
  71. //
  72.  
  73. /**************************************************************************
  74.  
  75.    CExtractIcon::QueryInterface
  76.  
  77. **************************************************************************/
  78.  
  79. STDMETHODIMP CExtractIcon::QueryInterface(REFIID riid, LPVOID *ppReturn)
  80. {
  81. *ppReturn = NULL;
  82.  
  83. //IUnknown
  84. if(IsEqualIID(riid, IID_IUnknown))
  85.    {
  86.    *ppReturn = this;
  87.    }
  88.  
  89. //IExtractIcon
  90. else if(IsEqualIID(riid, IID_IExtractIcon))
  91.    {
  92.    *ppReturn = (IExtractIcon*)this;
  93.    }
  94.  
  95. if(*ppReturn)
  96.    {
  97.    (*(LPUNKNOWN*)ppReturn)->AddRef();
  98.    return S_OK;
  99.    }
  100.  
  101. return E_NOINTERFACE;
  102. }                                             
  103.  
  104. /**************************************************************************
  105.  
  106.    CExtractIcon::AddRef
  107.  
  108. **************************************************************************/
  109.  
  110. STDMETHODIMP_(DWORD) CExtractIcon::AddRef()
  111. {
  112. return ++m_ObjRefCount;
  113. }
  114.  
  115. /**************************************************************************
  116.  
  117.    CExtractIcon::Release
  118.  
  119. **************************************************************************/
  120.  
  121. STDMETHODIMP_(DWORD) CExtractIcon::Release()
  122. {
  123. if(--m_ObjRefCount == 0)
  124.    {
  125.    delete this;
  126.    return 0;
  127.    }
  128.    
  129. return m_ObjRefCount;
  130. }
  131.  
  132. ///////////////////////////////////////////////////////////////////////////
  133. //
  134. // IExtractIcon Implementation
  135. //
  136.  
  137. /**************************************************************************
  138.  
  139.    CExtractIcon::GetIconLocation()
  140.    
  141. **************************************************************************/
  142.  
  143. STDMETHODIMP CExtractIcon::GetIconLocation(  UINT uFlags, 
  144.                                              LPTSTR szIconFile, 
  145.                                              UINT cchMax, 
  146.                                              LPINT piIndex, 
  147.                                              LPUINT puFlags)
  148. {
  149. //tell the shell to always call Extract
  150. *puFlags = GIL_NOTFILENAME;
  151.  
  152. //the pidl is either a value or a folder, so find out which it is
  153. if(m_pPidlMgr->IsValue(m_pPidlMgr->GetLastItem(m_pidl)))
  154.    {
  155.    //its a value
  156.    DWORD dwType;
  157.  
  158.    //get the data type to determine which icon to get
  159.    m_pPidlMgr->GetValueType(m_pidl, &dwType);
  160.  
  161.    switch(dwType)
  162.       {
  163.       case REG_BINARY:
  164.       case REG_DWORD:
  165.       case REG_DWORD_BIG_ENDIAN:
  166.          *piIndex = ICON_INDEX_BINARY;
  167.          break;
  168.  
  169.       default:
  170.          *piIndex = ICON_INDEX_STRING;
  171.          break;
  172.          }
  173.    }
  174. else
  175.    {
  176.    //its a key
  177.    if(uFlags & GIL_OPENICON)
  178.       {
  179.       *piIndex = ICON_INDEX_FOLDEROPEN;  //tell Extract to return the open icon
  180.       }
  181.    else
  182.       {
  183.       *piIndex = ICON_INDEX_FOLDER;  //tell Extract to return the open icon
  184.       }
  185.    }
  186.  
  187. return S_OK;
  188. }
  189.  
  190. /**************************************************************************
  191.  
  192.    CExtractIcon::Extract()
  193.    
  194. **************************************************************************/
  195.  
  196. STDMETHODIMP CExtractIcon::Extract( LPCTSTR pszFile, 
  197.                                     UINT nIconIndex, 
  198.                                     HICON *phiconLarge, 
  199.                                     HICON *phiconSmall, 
  200.                                     UINT nIconSize)
  201. {
  202. *phiconLarge = ImageList_GetIcon(g_himlLarge, nIconIndex, ILD_TRANSPARENT);
  203. *phiconSmall = ImageList_GetIcon(g_himlSmall, nIconIndex, ILD_TRANSPARENT);
  204.  
  205. /*
  206. if(nIconIndex)
  207.    {
  208.    *phiconLarge = ImageList_GetIcon(g_himlLarge, ICON_INDEX_FOLDEROPEN, ILD_TRANSPARENT);
  209.    *phiconSmall = ImageList_GetIcon(g_himlSmall, ICON_INDEX_FOLDEROPEN, ILD_TRANSPARENT);
  210.    }
  211. else
  212.    {
  213.    *phiconLarge = ImageList_GetIcon(g_himlLarge, ICON_INDEX_FOLDER, ILD_TRANSPARENT);
  214.    *phiconSmall = ImageList_GetIcon(g_himlSmall, ICON_INDEX_FOLDER, ILD_TRANSPARENT);
  215.    }
  216. */
  217. return S_OK;
  218. }
  219.  
  220.