218 lines
5.2 KiB
C++
218 lines
5.2 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
icon.cpp
|
|
|
|
Abstract:
|
|
|
|
This module implements icon handling code for the protected storage
|
|
explorer.
|
|
|
|
The shell uses these interfaces to retrieve icons associated with
|
|
folders in the protected storage namespace.
|
|
|
|
Author:
|
|
|
|
Scott Field (sfield) 11-Mar-97
|
|
|
|
--*/
|
|
|
|
#include <windows.h>
|
|
#include <shlobj.h>
|
|
|
|
#include "pstore.h"
|
|
|
|
#include "enumid.h"
|
|
#include "utility.h"
|
|
|
|
#include "icon.h"
|
|
#include "resource.h"
|
|
|
|
extern HINSTANCE g_hInst;
|
|
extern LONG g_DllRefCount;
|
|
|
|
|
|
CExtractIcon::CExtractIcon(
|
|
LPCITEMIDLIST pidl
|
|
)
|
|
{
|
|
|
|
//
|
|
// squirrel away the type value and key type associated with the specified
|
|
// pidl
|
|
//
|
|
|
|
m_dwType = GetPidlType(pidl);
|
|
m_KeyType = GetPidlKeyType(pidl);
|
|
|
|
m_ObjRefCount = 1;
|
|
}
|
|
|
|
|
|
CExtractIcon::~CExtractIcon()
|
|
{
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CExtractIcon::QueryInterface(
|
|
REFIID riid,
|
|
LPVOID *ppReturn
|
|
)
|
|
{
|
|
*ppReturn = NULL;
|
|
|
|
if(IsEqualIID(riid, IID_IUnknown))
|
|
*ppReturn = (IUnknown*)(IExtractIcon*)this;
|
|
else if(IsEqualIID(riid, IID_IExtractIcon))
|
|
*ppReturn = (IUnknown*)(IExtractIcon*)this;
|
|
|
|
if(*ppReturn == NULL)
|
|
return E_NOINTERFACE;
|
|
|
|
(*(LPUNKNOWN*)ppReturn)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(DWORD)
|
|
CExtractIcon::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_ObjRefCount);
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(DWORD)
|
|
CExtractIcon::Release()
|
|
{
|
|
LONG lDecremented = InterlockedDecrement(&m_ObjRefCount);
|
|
|
|
if(lDecremented == 0)
|
|
delete this;
|
|
|
|
return lDecremented;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CExtractIcon::GetIconLocation(
|
|
UINT uFlags,
|
|
LPTSTR szIconFile,
|
|
UINT cchMax,
|
|
LPINT piIndex,
|
|
LPUINT puFlags
|
|
)
|
|
{
|
|
//
|
|
// tell the shell to always call Extract
|
|
//
|
|
|
|
*puFlags = GIL_NOTFILENAME;
|
|
|
|
if(uFlags & GIL_OPENICON) {
|
|
*piIndex = 1; // tell Extract to return the open icon
|
|
} else {
|
|
*piIndex = 0;
|
|
|
|
//
|
|
// if the icon request is associated with the "global" local machine,
|
|
// and is at the Type or Subtype level, display a different icon.
|
|
//
|
|
|
|
if( m_KeyType == PST_KEY_LOCAL_MACHINE &&
|
|
(m_dwType == PIDL_TYPE_TYPE || m_dwType == PIDL_TYPE_SUBTYPE) )
|
|
*piIndex = 2;
|
|
}
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CExtractIcon::Extract(
|
|
LPCTSTR pszFile,
|
|
UINT nIconIndex,
|
|
HICON *phiconLarge,
|
|
HICON *phiconSmall,
|
|
UINT nIconSize
|
|
)
|
|
{
|
|
LPTSTR Resource;
|
|
|
|
UINT nIconSizeLarge = (UINT)LOWORD(nIconSize);
|
|
UINT nIconSizeSmall = (UINT)HIWORD(nIconSize);
|
|
|
|
//
|
|
// note icons are cached for performance reasons.
|
|
//
|
|
|
|
switch (nIconIndex) {
|
|
case 0:
|
|
static UINT nIconSizeSmallFolder;
|
|
static UINT nIconSizeLargeFolder;
|
|
static HICON hIconSmallFolder;
|
|
static HICON hIconLargeFolder;
|
|
|
|
Resource = MAKEINTRESOURCE(IDI_FOLDER);
|
|
|
|
if(nIconSizeSmall != nIconSizeSmallFolder) {
|
|
hIconSmallFolder = (HICON)LoadImage(g_hInst, Resource, IMAGE_ICON, nIconSizeSmall, nIconSizeSmall, LR_DEFAULTCOLOR | LR_SHARED);
|
|
nIconSizeSmallFolder = nIconSizeSmall;
|
|
}
|
|
*phiconSmall = hIconSmallFolder;
|
|
|
|
if(nIconSizeLarge != nIconSizeLargeFolder) {
|
|
hIconLargeFolder = (HICON)LoadImage(g_hInst, Resource, IMAGE_ICON, nIconSizeLarge, nIconSizeLarge, LR_DEFAULTCOLOR | LR_SHARED);
|
|
nIconSizeLargeFolder = nIconSizeLarge;
|
|
}
|
|
*phiconLarge = hIconLargeFolder;
|
|
return S_OK;
|
|
case 1:
|
|
static UINT nIconSizeSmallFolderOpen;
|
|
static UINT nIconSizeLargeFolderOpen;
|
|
static HICON hIconSmallFolderOpen;
|
|
static HICON hIconLargeFolderOpen;
|
|
|
|
Resource = MAKEINTRESOURCE(IDI_FOLDEROPEN);
|
|
|
|
if(nIconSizeSmall != nIconSizeSmallFolderOpen) {
|
|
hIconSmallFolderOpen = (HICON)LoadImage(g_hInst, Resource, IMAGE_ICON, nIconSizeSmall, nIconSizeSmall, LR_DEFAULTCOLOR | LR_SHARED);
|
|
nIconSizeSmallFolderOpen = nIconSizeSmall;
|
|
}
|
|
*phiconSmall = hIconSmallFolderOpen;
|
|
|
|
if(nIconSizeLarge != nIconSizeLargeFolderOpen) {
|
|
hIconLargeFolderOpen = (HICON)LoadImage(g_hInst, Resource, IMAGE_ICON, nIconSizeLarge, nIconSizeLarge, LR_DEFAULTCOLOR | LR_SHARED);
|
|
nIconSizeLargeFolderOpen = nIconSizeLarge;
|
|
}
|
|
*phiconLarge = hIconLargeFolderOpen;
|
|
return S_OK;
|
|
case 2:
|
|
static UINT nIconSizeSmallGlobal;
|
|
static UINT nIconSizeLargeGlobal;
|
|
static HICON hIconSmallGlobal;
|
|
static HICON hIconLargeGlobal;
|
|
|
|
Resource = MAKEINTRESOURCE(IDI_GLOBAL);
|
|
|
|
if(nIconSizeSmall != nIconSizeSmallGlobal) {
|
|
hIconSmallGlobal = (HICON)LoadImage(g_hInst, Resource, IMAGE_ICON, nIconSizeSmall, nIconSizeSmall, LR_DEFAULTCOLOR | LR_SHARED);
|
|
nIconSizeSmallGlobal = nIconSizeSmall;
|
|
}
|
|
*phiconSmall = hIconSmallGlobal;
|
|
|
|
if(nIconSizeLarge != nIconSizeLargeGlobal) {
|
|
hIconLargeGlobal = (HICON)LoadImage(g_hInst, Resource, IMAGE_ICON, nIconSizeLarge, nIconSizeLarge, LR_DEFAULTCOLOR | LR_SHARED);
|
|
nIconSizeLargeGlobal = nIconSizeLarge;
|
|
}
|
|
*phiconLarge = hIconLargeGlobal;
|
|
return S_OK;
|
|
default:
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|