|
|
//---------------------------------------------------------------------------
//
// File: PROPSEXT.CPP
//
// Implementation of the CPropSheetExt object.
//
//---------------------------------------------------------------------------
#include "precomp.hxx"
#pragma hdrstop
//Defines for getting registry settings
const TCHAR c_szHICKey[] = TEXT("Control Panel\\Desktop\\WindowMetrics"); // show icons using highest possible colors
const TCHAR c_szHICVal[] = TEXT("Shell Icon BPP"); // (4 if the checkbox is false, otherwise 16, don't set it to anything else)
const TCHAR c_szHIKey[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"); const TCHAR c_szHIVal[] = TEXT("HideIcons"); const TCHAR c_szWMSISVal[] = TEXT("Shell Icon Size"); // Normal Icon Size (default 32 x 32)
const TCHAR c_szTitle[] = TEXT("Effects"); #ifdef INET_EXP_ICON
const TCHAR c_szIEXP[] = TEXT("\\Program Files\\Microsoft Internet Explorer 4"); #endif
#define HSUBKEY_HIC (LPTSTR)c_szHICKey
#define HVALUE_HIC (LPTSTR)c_szHICVal
#define HSUBKEY_WM (LPTSTR)c_szHICKey
#define HVALUE_WMSIS (LPTSTR)c_szWMSISVal
#define ICON_DEFAULT_SMALL 16
#define ICON_DEFAULT_NORMAL 32
#define ICON_DEFAULT_LARGE 48
enum ICON_SIZE_TYPES { ICON_DEFAULT = 0, ICON_LARGE = 1, ICON_INDETERMINATE = 2 };
// Registry Info for the icons
typedef struct tagIconRegKeys { TCHAR szIconSubKey[128]; TCHAR szIconValue[16]; TCHAR szTitleSubKey[128]; int iTitleResource; int iDefaultTitleResource; BOOL bNTOnly; }ICONREGKEYS;
ICONREGKEYS sIconRegKeys[] = { // "My Computer" icon
{ TEXT("CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\DefaultIcon"), TEXT("\0"), TEXT("CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"), NULL, IDS_MYCOMPUTER, FALSE },
// "My Documents" icon
{ TEXT("CLSID\\{450D8FBA-AD25-11D0-98A8-0800361B1103}\\DefaultIcon"), TEXT("\0"), TEXT("CLSID\\{450D8FBA-AD25-11D0-98A8-0800361B1103}"), NULL, IDS_MYDOCUMENTS, FALSE },
// This one doesn't seem to pick up updates, so disable for now...
#ifdef INET_EXP_ICON
// "Internet Explorer" icon
{ TEXT("CLSID\\{FBF23B42-E3F0-101B-8488-00AA003E56F8}\\DefaultIcon"), TEXT("\0"), TEXT("CLSID\\{FBF23B42-E3F0-101B-8488-00AA003E56F8}"), NULL, IDS_INTERNET }, #endif
// "Net Neighbourhood" icon
{ TEXT("CLSID\\{208D2C60-3AEA-1069-A2D7-08002B30309D}\\DefaultIcon"), TEXT("\0"), TEXT("CLSID\\{208D2C60-3AEA-1069-A2D7-08002B30309D}"), NULL, IDS_NETNEIGHBOUR },
// "Trash full" icon
{ TEXT("CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\DefaultIcon"), TEXT("full"), TEXT("CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}"), IDS_FULL, IDS_TRASHFULL },
// "Trash empty" icon
{ TEXT("CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\DefaultIcon"), TEXT("empty"), TEXT("CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}"), IDS_EMPTY, IDS_TRASHEMPTY },
//
// This is not a desktop icon, so for now it's not included.
//
/*
// "Directory" icon
{ TEXT("CLSID\\{FE1290F0-CFBD-11CF-A330-00AA00C16E65}\\DefaultIcon"), TEXT("\0"), TEXT("CLSID\\{FE1290F0-CFBD-11CF-A330-00AA00C16E65}"), NULL, IDS_DIRECTORY }, */
};
#define NUM_ICONS (ARRAYSIZE(sIconRegKeys))
#define PATH_WIN 0
#define PATH_SYS 1
#define PATH_IEXP 2
typedef struct tagDefIcons { int iIndex; UINT uPath; TCHAR szFile[16]; }DEFICONS;
DEFICONS sDefaultIcons[NUM_ICONS] = { { 0,PATH_WIN ,TEXT("\\EXPLORER.EXE")}, // "My Computer" default icon
{ 0,PATH_SYS ,TEXT("\\mydocs.dll")}, // "My Documents" default icon
#ifdef INET_EXP_ICON
{ 0,PATH_IEXP,TEXT("\\iexplore.exe")}, // "Internet Explorer" default icon
#endif
{17,PATH_SYS, TEXT("\\shell32.dll")}, // "Net Neighbourhood" default icon
{32,PATH_SYS, TEXT("\\shell32.dll")}, // "Trash full" default icon
{31,PATH_SYS, TEXT("\\shell32.dll")}, // "Trash empty" default icon
// { 0,TEXT("\\dsfolder.dll")}, // "Directory" default icon
};
// Name of the file that holds each icon, and an index for which icon to use in the file
typedef struct tagIconKeys { TCHAR szOldFile[MAX_PATH]; int iOldIndex; TCHAR szNewFile[MAX_PATH]; int iNewIndex; }ICONDATA;
ICONDATA sIconData[NUM_ICONS];
typedef struct { DWORD dwControlID; DWORD dwHelpContextID; }POPUP_HELP_ARRAY;
POPUP_HELP_ARRAY phaMainWin[] = { { (DWORD)IDC_ICONS, (DWORD)IDH_DISPLAY_PLUSPACK_LIST }, { (DWORD)IDC_CHANGEICON, (DWORD)IDH_DISPLAY_PLUSPACK_CHANGEICON }, { (DWORD)IDC_LARGEICONS, (DWORD)IDH_DISPLAY_PLUSPACK_LARGEICONS }, { (DWORD)IDC_ICONHIGHCOLOR, (DWORD)IDH_DISPLAY_PLUSPACK_ALLCOLORS }, { (DWORD)IDC_ICONDEFAULT, (DWORD)IDH_DISPLAY_PLUSPACK_DEFAULT_ICON }, { (DWORD)IDC_GRPBOX_1, (DWORD)IDH_COMM_GROUPBOX }, { (DWORD)IDC_GRPBOX_2, (DWORD)IDH_COMM_GROUPBOX }, { (DWORD)0, (DWORD)0 }, { (DWORD)0, (DWORD)0 }, // double-null terminator NECESSARY!
};
POPUP_HELP_ARRAY phaMainWinPlus[] = { { (DWORD)IDC_ICONS, (DWORD)IDH_PLUS_PLUSPACK_LIST }, { (DWORD)IDC_CHANGEICON, (DWORD)IDH_PLUS_PLUSPACK_CHANGEICON }, { (DWORD)IDC_LARGEICONS, (DWORD)IDH_PLUS_PLUSPACK_LARGEICONS }, { (DWORD)IDC_ICONHIGHCOLOR, (DWORD)IDH_PLUS_PLUSPACK_ALLCOLORS }, { (DWORD)IDC_GRPBOX_1, (DWORD)IDH_COMM_GROUPBOX }, { (DWORD)IDC_GRPBOX_2, (DWORD)IDH_COMM_GROUPBOX }, { (DWORD)0, (DWORD)0 }, { (DWORD)0, (DWORD)0 }, // double-null terminator NECESSARY!
};
POPUP_HELP_ARRAY * g_phaHelp = NULL;
HWND hWndList; // handle to the list view window
HIMAGELIST hIconList; // handles to image lists for large icons
// Handle to the DLL
extern HINSTANCE g_hInst;
// vars needed for new shell api
#define SZ_SHELL32 TEXT("shell32.dll")
#define SZ_SHUPDATERECYCLEBINICON "SHUpdateRecycleBinIcon" // Parameter for GetProcAddr()... DO NOT TEXT("") IT!
HINSTANCE hmodShell32 = NULL; typedef void (* PFNSHUPDATERECYCLEBINICON)( void ); PFNSHUPDATERECYCLEBINICON pfnSHUpdateRecycleBinIcon = NULL;
// Function prototype
INT_PTR CALLBACK PlusPackDlgProc( HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam ); HWND CreateListView( HWND hWndParent );
// Icon Stuff
int GetIconState (void); BOOL ChangeIconSizes (HWND hDlg, int iOldState, int iNewState);
HRESULT ExtractPlusColorIcon(LPCTSTR szPath, int nIndex, HICON *phIcon, UINT uSizeLarge, UINT uSizeSmall); BOOL gfCoInitDone = FALSE; // track state of OLE CoInitialize()
//---------------------------------------------------------------------------
// Class Member functions
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Constructor
//---------------------------------------------------------------------------
CPropSheetExt::CPropSheetExt( LPUNKNOWN pUnkOuter, LPFNDESTROYED pfnDestroy ) { m_cRef = 0; m_pUnkOuter = pUnkOuter; m_pfnDestroy = pfnDestroy; return; }
//---------------------------------------------------------------------------
// Destructor
//---------------------------------------------------------------------------
CPropSheetExt::~CPropSheetExt( void ) { return; }
//---------------------------------------------------------------------------
// QueryInterface()
//---------------------------------------------------------------------------
STDMETHODIMP CPropSheetExt::QueryInterface( REFIID riid, LPVOID* ppv ) { *ppv = NULL;
if( IsEqualIID( riid, IID_IShellPropSheetExt ) ) { *ppv = (LPVOID)this; ++m_cRef; return NOERROR; } return ResultFromScode(E_NOINTERFACE); }
//---------------------------------------------------------------------------
// AddRef()
//---------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CPropSheetExt::AddRef( void ) { return ++m_cRef; }
//---------------------------------------------------------------------------
// Release()
//---------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CPropSheetExt::Release( void ) { ULONG cRefT;
cRefT = --m_cRef;
if( m_cRef == 0 ) { // Tell the housing that an object is going away so that it
// can shut down if appropriate.
if( NULL != m_pfnDestroy ) { (*m_pfnDestroy)(); } delete this; } return cRefT; }
//---------------------------------------------------------------------------
// AddPages()
//---------------------------------------------------------------------------
STDMETHODIMP CPropSheetExt::AddPages( LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam ) { PROPSHEETPAGE psp; HPROPSHEETPAGE hpage; TCHAR szTitle[ 30 ];
LoadString( g_hInst, IDS_ICONS, szTitle, ARRAYSIZE(szTitle) ); psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwFlags = PSP_USETITLE; psp.hIcon = NULL; psp.hInstance = g_hInst; psp.pszTemplate =MAKEINTRESOURCE( PLUSPACK_DLG ); psp.pfnDlgProc = PlusPackDlgProc; psp.pszTitle = szTitle; psp.lParam = 0;
if( ( hpage = CreatePropertySheetPage( &psp ) ) == NULL ) { return ( E_OUTOFMEMORY ); }
if( !lpfnAddPage( hpage, lParam ) ) { DestroyPropertySheetPage( hpage ); return ( E_FAIL ); } return NOERROR; }
//---------------------------------------------------------------------------
// ReplacePage()
//---------------------------------------------------------------------------
STDMETHODIMP CPropSheetExt::ReplacePage( UINT uPageID, LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam ) { return NOERROR; }
//---------------------------------------------------------------------------
//
// PlusPackDlgProc()
//
// The dialog procedure for the "PlusPack" property sheet page.
//
//---------------------------------------------------------------------------
INT_PTR CALLBACK PlusPackDlgProc( HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam ) { LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE)GetWindowLong( hDlg, DWL_USER ); static int iOldLI, iNewLI; // Large Icon State
static int iOldHIC, iNewHIC; // High Icon Colour
static BOOL bOldMA, bNewMA; // Menu Animation State
static BOOL bOldSF, bNewSF; // Font Smoothing State
static BOOL bOldDW, bNewDW; // Drag Window State
static BOOL bOldHI, bNewHI; // Hide Icons State
BOOL bDorked = FALSE, bRet, bDorkedIcons; static int iIndex, iX; static char szHelpFile[32];
switch( uMessage ) { case WM_INITDIALOG: { OSVERSIONINFO osvi; UINT id = IDS_HELPFILE_PLUS;
// Create our list view and fill it with the system icons
CreateListView( hDlg ); iIndex = 0;
SetWindowLong( hDlg, DWL_USER, lParam ); psp = (LPPROPSHEETPAGE)lParam;
// Get the name of our help file. For Memphis, it's
// IDS_HELPFILE_PLUS for NT it's IDS_HELPFILE.
g_phaHelp = phaMainWinPlus; osvi.dwOSVersionInfoSize = sizeof(osvi); if (GetVersionEx( &osvi )) { if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { id = IDS_HELPFILE; g_phaHelp = phaMainWin; } }
LoadString( g_hInst, id, szHelpFile, 32 );
// Get the values for the settings from the registry and set the checkboxes
// Large Icons
iOldLI = GetIconState (); if (iOldLI == ICON_INDETERMINATE) { HWND hItem = GetDlgItem (hDlg, IDC_LARGEICONS); SendMessage( hItem, BM_SETSTYLE, (WPARAM)LOWORD(BS_AUTO3STATE), MAKELPARAM( FALSE,0) ); } iNewLI = iOldLI; SendMessage( (HWND)GetDlgItem( hDlg, IDC_LARGEICONS ), BM_SETCHECK, (WPARAM)iOldLI, 0 );
// Full Color Icons
bRet = GetRegValueInt( HKEY_CURRENT_USER, HSUBKEY_HIC, HVALUE_HIC, &iOldHIC );
if( bRet == FALSE ) // Key not in registry yet
{ iOldHIC = iNewHIC = 4; }
iNewHIC = iOldHIC; SendMessage( (HWND)GetDlgItem( hDlg, IDC_ICONHIGHCOLOR ), BM_SETCHECK, (WPARAM)(BOOL)(iOldHIC == 16), 0 );
// Hide Icons
bOldHI = (BOOL)GetRegValueDword( HKEY_CURRENT_USER, (LPTSTR)c_szHIKey, (LPTSTR)c_szHIVal ); if (bOldHI == REG_BAD_DWORD) { bOldHI = FALSE; } SendMessage( (HWND)GetDlgItem( hDlg, IDC_HIDEICONS ), BM_SETCHECK, (WPARAM)bOldHI, 0 ); bNewHI = bOldHI;
// Use menu animations
bOldMA = FALSE; SystemParametersInfo( SPI_GETMENUANIMATION, 0, (PVOID)&bOldMA, 0 ); SendMessage( (HWND)GetDlgItem( hDlg, IDC_MENUANIMATION ), BM_SETCHECK, (WPARAM)bOldMA, 0 ); bNewMA = bOldMA;
// Smooth edges of screen fonts
bOldSF = FALSE; SystemParametersInfo( SPI_GETFONTSMOOTHING, 0, (PVOID)&bOldSF, 0 ); SendMessage( (HWND)GetDlgItem( hDlg, IDC_FONTSMOOTH ), BM_SETCHECK, (WPARAM)bOldSF, 0 ); bNewSF = bOldSF;
// Show contents while dragging
bOldDW = FALSE; SystemParametersInfo( SPI_GETDRAGFULLWINDOWS, 0, (PVOID)&bOldDW, 0 ); SendMessage( (HWND)GetDlgItem( hDlg, IDC_SHOWDRAG ), BM_SETCHECK, (WPARAM)bOldDW, 0 ); bNewDW = bOldDW;
// Load SHUpdateRecycleBinIcon() if it exists
hmodShell32 = LoadLibrary(SZ_SHELL32); pfnSHUpdateRecycleBinIcon = (PFNSHUPDATERECYCLEBINICON)GetProcAddress( hmodShell32, SZ_SHUPDATERECYCLEBINICON ); } break;
case WM_DESTROY: if ( gfCoInitDone ) CoUninitialize(); if (hmodShell32) FreeLibrary(hmodShell32); break;
case WM_COMMAND: switch( LOWORD(wParam) ) { case IDC_LARGEICONS: iNewLI = SendMessage ( (HWND)lParam, BM_GETCHECK, 0, 0 ); bDorked = TRUE; break;
case IDC_ICONHIGHCOLOR: iNewHIC = 4; if( SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == TRUE ) { iNewHIC = 16; } bDorked = TRUE; break;
case IDC_SHOWDRAG: bNewDW = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED); bDorked = TRUE; break;
case IDC_HIDEICONS: bNewHI = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED); bDorked = TRUE; break;
case IDC_MENUANIMATION: bNewMA = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED); bDorked = TRUE; break;
case IDC_FONTSMOOTH: bNewSF = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED); bDorked = TRUE; break;
case IDC_CHANGEICON: { INT i = sIconData[iIndex].iOldIndex; WCHAR szTemp[ MAX_PATH ]; TCHAR szExp[ MAX_PATH ];
ExpandEnvironmentStrings( sIconData[iIndex].szOldFile, szExp, ARRAYSIZE(szExp) );
if (g_RunningOnNT) { MultiByteToWideChar( CP_ACP, 0, szExp, -1, szTemp, ARRAYSIZE(szTemp) ); } else { lstrcpy( (LPTSTR)szTemp, szExp ); }
if ( PickIconDlg( hDlg, (LPTSTR)szTemp, ARRAYSIZE(szTemp), &i ) == TRUE ) { HICON hIcon;
if (g_RunningOnNT) { WideCharToMultiByte( CP_ACP, 0, szTemp, -1, sIconData[iIndex].szNewFile, ARRAYSIZE(sIconData[iIndex].szNewFile), NULL, NULL ); } else { lstrcpy( sIconData[iIndex].szNewFile, (LPTSTR)szTemp ); } sIconData[iIndex].iNewIndex = i; ExtractPlusColorIcon( sIconData[iIndex].szNewFile, sIconData[iIndex].iNewIndex, &hIcon, 0, 0 );
ImageList_ReplaceIcon( hIconList, iIndex, hIcon ); ListView_RedrawItems( hWndList, iIndex, iIndex ); bDorked = TRUE; } } break;
case IDC_ICONDEFAULT: { TCHAR szTemp[_MAX_PATH]; HICON hIcon;
switch( sDefaultIcons[iIndex].uPath ) { case PATH_WIN: GetWindowsDirectory( szTemp, ARRAYSIZE(szTemp) ); break;
#ifdef INET_EXP_ICON
case PATH_IEXP: if (g_RunningOnNT) { lstrcpy( szTemp, TEXT("%SystemDrive%") ); } else { GetWindowsDirectory( szTemp, ARRAYSIZE(szTemp) );
//
// Clear out path after drive, ie: C:
//
szTemp[ 2 ] = 0; } lstrcat( szTemp, c_szIEXP ); break; #endif
case PATH_SYS: default: GetSystemDirectory( szTemp, ARRAYSIZE(szTemp) ); break;
}
lstrcat( szTemp, sDefaultIcons[iIndex].szFile ); lstrcpy( sIconData[iIndex].szNewFile, szTemp ); sIconData[iIndex].iNewIndex = sDefaultIcons[iIndex].iIndex;
ExtractPlusColorIcon( sIconData[iIndex].szNewFile, sIconData[iIndex].iNewIndex, &hIcon, 0, 0 );
ImageList_ReplaceIcon( hIconList, iIndex, hIcon ); ListView_RedrawItems( hWndList, iIndex, iIndex ); bDorked = TRUE; } break; default: break; }
// If the user dorked with a setting, tell the property manager we
// have outstanding changes. This will enable the "Apply Now" button...
if( bDorked ) { SendMessage( GetParent( hDlg ), PSM_CHANGED, (WPARAM)hDlg, 0L ); } break;
case WM_NOTIFY: switch( ((NMHDR *)lParam)->code ) { case LVN_ITEMCHANGED: // The selection changed in our listview
if( wParam == IDC_ICONS ) { BOOL bEnable = FALSE; // Find out who's selected now
for( iIndex = 0; iIndex < NUM_ICONS;iIndex++ ) { if( ListView_GetItemState( hWndList, iIndex, LVIS_SELECTED ) ) { bEnable = TRUE; break; } } EnableWindow( GetDlgItem( hDlg, IDC_CHANGEICON ), bEnable ); EnableWindow( GetDlgItem( hDlg, IDC_ICONDEFAULT ), bEnable ); } break;
case PSN_APPLY: // OK or Apply clicked
{ HDC hDC = GetDC( NULL ); int iBitsPerPixel;
iBitsPerPixel = GetDeviceCaps( hDC, BITSPIXEL ); ReleaseDC( NULL, hDC );
// Large Icons
bDorkedIcons = ChangeIconSizes (hDlg, iOldLI, iNewLI); if (bDorkedIcons) { iOldLI = iNewLI; bDorked = TRUE; }
// Full Color Icons
if( iOldHIC != iNewHIC ) { TCHAR szTemp1[512]; TCHAR szTemp2[256];
bRet = SetRegValueInt( HKEY_CURRENT_USER, HSUBKEY_HIC, HVALUE_HIC, iNewHIC ); iOldHIC = iNewHIC; if ((iBitsPerPixel < 16) && (iNewHIC == 16)) // Display mode won't support icon high colors
{ LoadString (g_hInst, IDS_256COLORPROBLEM, szTemp1, ARRAYSIZE(szTemp1) ); LoadString( g_hInst, IDS_ICONCOLORWONTWORK, szTemp2, ARRAYSIZE(szTemp2) ); lstrcat (szTemp1, szTemp2); MessageBox( hDlg, szTemp1, c_szTitle, MB_OK ); } else { LoadString( g_hInst, IDS_REBOOTFORCHANGE, szTemp1, ARRAYSIZE(szTemp1) ); MessageBox( hDlg, szTemp1, c_szTitle, MB_OK ); } }
// Full window drag
if ( bOldDW != bNewDW ) { bOldDW = bNewDW; SystemParametersInfo( SPI_SETDRAGFULLWINDOWS, bNewDW, NULL, SPIF_SENDCHANGE ); }
// Font smoothing
if ( bOldSF != bNewSF ) { bOldSF = bNewSF; SystemParametersInfo( SPI_SETFONTSMOOTHING, bNewSF, NULL, SPIF_SENDCHANGE ); }
// Menu animations
if ( bOldMA != bNewMA ) { bOldMA = bNewMA; SystemParametersInfo( SPI_SETMENUANIMATION, bNewMA, NULL, SPIF_SENDCHANGE ); }
// Hide Icons
if ( bOldHI != bNewHI ) { bOldHI = bNewHI; SetRegValueDword( HKEY_CURRENT_USER, (LPTSTR)c_szHIKey, (LPTSTR)c_szHIVal, (DWORD)bNewHI ); }
// Change the system icons
for( iX = 0;iX < NUM_ICONS;iX++ ) {
if( (lstrcmpi( sIconData[iX].szNewFile, sIconData[iX].szOldFile ) != 0) || (sIconData[iX].iNewIndex != sIconData[iX].iOldIndex) ) { TCHAR szTemp[MAX_PATH];
wsprintf( szTemp, TEXT("%s,%d"), sIconData[iX].szNewFile, sIconData[iX].iNewIndex ); bRet = IconSetRegValueString( sIconRegKeys[iX].szIconSubKey, sIconRegKeys[iX].szIconValue, (LPTSTR)szTemp );
// Next two lines necessary if the user does an Apply as opposed to OK
lstrcpy( sIconData[iX].szOldFile, sIconData[iX].szNewFile ); sIconData[iX].iOldIndex = sIconData[iX].iNewIndex; bDorked = TRUE; } }
// Make the system notice we changed the system icons
if( bDorked ) { SHChangeNotify( SHCNE_ASSOCCHANGED, 0, NULL, NULL ); // should do the trick!
if (pfnSHUpdateRecycleBinIcon != NULL) { pfnSHUpdateRecycleBinIcon(); } }
if (bDorkedIcons) { SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); }
break; } default: break; } break;
case WM_HELP: { LPHELPINFO lphi = (LPHELPINFO)lParam;
if( lphi->iContextType == HELPINFO_WINDOW ) { WinHelp( (HWND)lphi->hItemHandle, (LPTSTR)szHelpFile, HELP_WM_HELP, (DWORD)((POPUP_HELP_ARRAY FAR *)g_phaHelp) ); } } break;
case WM_CONTEXTMENU: // first check for dlg window
if( (HWND)wParam == hDlg ) { // let the def dlg proc decide whether to respond or ignore;
// necessary for title bar sys menu on right click
return FALSE; // didn't process message EXIT
} else { // else go for the controls
WinHelp( (HWND)wParam, (LPTSTR)szHelpFile, HELP_CONTEXTMENU, (DWORD)((POPUP_HELP_ARRAY FAR *)g_phaHelp) ); } break;
default: return FALSE; } return(TRUE); }
/****************************************************************************
* * FUNCTION: CreateListView(HWND) * * PURPOSE: Creates the list view window and initializes it * ****************************************************************************/ HWND CreateListView( HWND hWndParent ) { LV_ITEM lvI; // List view item structure
TCHAR szTemp[MAX_PATH]; BOOL bEnable = FALSE; RECT rc;
// Create a device independant size and location
LONG lWndunits = GetDialogBaseUnits(); int iWndx = LOWORD(lWndunits); int iWndy = HIWORD(lWndunits); int iX = ((11 * iWndx) / 4); int iY = ((15 * iWndy) / 8); int iWidth = ((163 * iWndx) / 4); int iHeight = ((40 * iWndy) / 8);
// Ensure that the common control DLL is loaded.
InitCommonControls();
// Get the list view window
hWndList = GetDlgItem (hWndParent, IDC_ICONS); if( hWndList == NULL ) return NULL;
// initialize the list view window
// First, initialize the image lists we will need
hIconList = ImageList_Create( 32, 32, ILC_MASK | ILC_COLOR24, NUM_ICONS, 0 ); // create an image list for the icons
// load the icons and add them to the image lists
// get the icon files and indexes from the registry, including for the Default recycle bin
for( iX = 0; iX < NUM_ICONS; iX++ ) { TCHAR* pPos; HICON hIcon; BOOL bRet;
bRet = IconGetRegValueString( sIconRegKeys[iX].szIconSubKey, sIconRegKeys[iX].szIconValue, (LPSTR)szTemp, MAX_PATH );
int iIndex = PathParseIconLocation( szTemp );
// store the icon information
lstrcpy( sIconData[iX].szOldFile, szTemp ); lstrcpy( sIconData[iX].szNewFile, szTemp ); sIconData[iX].iOldIndex = iIndex; sIconData[iX].iNewIndex = iIndex;
ExtractPlusColorIcon( szTemp, iIndex, &hIcon, 0, 0);
// Added this "if" to fix bug 2831. We want to use SHELL32.DLL
// icon 0 if there is no icon in the file specified in the
// registry (or if the registry didn't specify a file).
if( hIcon == NULL ) { GetSystemDirectory( szTemp, sizeof(szTemp) ); lstrcat( szTemp, TEXT("\\shell32.dll") ); lstrcpy( sIconData[iX].szOldFile, szTemp ); lstrcpy( sIconData[iX].szNewFile, szTemp ); sIconData[iX].iOldIndex = sIconData[iX].iNewIndex = 0;
hIcon = ExtractIcon( g_hInst, szTemp, iIndex ); }
if (ImageList_AddIcon( hIconList, hIcon ) == -1) { return NULL; } }
// Make sure that all of the icons were added
if( ImageList_GetImageCount( hIconList ) < NUM_ICONS ) return FALSE;
ListView_SetImageList( hWndList, hIconList, LVSIL_NORMAL );
// Make sure the listview has WS_HSCROLL set on it.
DWORD dwStyle = GetWindowLong( hWndList, GWL_STYLE ); SetWindowLong( hWndList, GWL_STYLE, (dwStyle & (~WS_VSCROLL)) | WS_HSCROLL );
// Finally, let's add the actual items to the control. Fill in the LV_ITEM
// structure for each of the items to add to the list. The mask specifies
// the the .pszText, .iImage, and .state members of the LV_ITEM structure are valid.
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0;
for( iX = 0; iX < NUM_ICONS; iX++ ) { TCHAR szAppend[64]; BOOL bRet;
bRet = IconGetRegValueString( sIconRegKeys[iX].szTitleSubKey, NULL, (LPTSTR)szTemp, MAX_PATH );
// if the title string was in the registry, else we have to use the default in our resources
if( (bRet) && (lstrlen(szTemp) > 0) ) { if( LoadString( g_hInst, sIconRegKeys[iX].iTitleResource, szAppend, 64 ) != 0 ) { lstrcat( szTemp, szAppend ); } } else { LoadString( g_hInst, sIconRegKeys[iX].iDefaultTitleResource, szTemp, MAX_PATH ); }
lvI.iItem = iX; lvI.iSubItem = 0; lvI.pszText = (LPSTR)&(szTemp); lvI.cchTextMax = lstrlen(szTemp); lvI.iImage = iX;
if( ListView_InsertItem( hWndList, &lvI ) == -1 ) return NULL;
} /*
// To fix long standing listview bug, we need to "jiggle" the listview
// window size so that it will do a recompute and realize that we need a
// scroll bar...
GetWindowRect( hWndList, &rc ); MapWindowPoints( NULL, hWndParent, (LPPOINT)&rc, 2 ); MoveWindow( hWndList, rc.left, rc.top, rc.right - rc.left+1, rc.bottom - rc.top, FALSE ); MoveWindow( hWndList, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE ); */ // Set First item to selected
ListView_SetItemState (hWndList, 0, LVIS_SELECTED, LVIS_SELECTED);
// Get Selected item
for(int iIndex = 0;iIndex < NUM_ICONS;iIndex++ ) { if( ListView_GetItemState( hWndList, iIndex, LVIS_SELECTED ) ) { bEnable = TRUE; break; } }
EnableWindow( GetDlgItem( hWndParent, IDC_CHANGEICON ), bEnable ); EnableWindow( GetDlgItem( hWndParent, IDC_ICONDEFAULT ), bEnable );
return (hWndList); }
int GetIconState (void) { BOOL bRet; int iSize;
bRet = GetRegValueInt (HKEY_CURRENT_USER, HSUBKEY_WM, HVALUE_WMSIS, &iSize); if (bRet == FALSE) return ICON_DEFAULT;
if (iSize == ICON_DEFAULT_NORMAL) return ICON_DEFAULT; else if (iSize == ICON_DEFAULT_LARGE) return ICON_LARGE; return ICON_INDETERMINATE; }
BOOL ChangeIconSizes (HWND hDlg, int iOldState, int iNewState) { BOOL bRet; int iOldSize, iNewSize; int iHorz; int iVert;
// Don't bother if nothing changed
if (iOldState == iNewState) return FALSE;
// Get New Size
switch (iNewState) { case ICON_DEFAULT: iNewSize = ICON_DEFAULT_NORMAL; break;
case ICON_LARGE: iNewSize = ICON_DEFAULT_LARGE; break;
case ICON_INDETERMINATE: // Don't bother to change anything
return FALSE;
default: return FALSE; }
// Get Original Size
bRet = GetRegValueInt (HKEY_CURRENT_USER, HSUBKEY_WM, HVALUE_WMSIS, &iOldSize); if (!bRet) { // Try geting system default instead
iOldSize = GetSystemMetrics (SM_CXICON); }
// Don't need to change size if nothing has really changed
if (iNewSize == iOldSize) return FALSE;
// Get new horizontal spacing
iHorz = GetSystemMetrics (SM_CXICONSPACING); iHorz -= iOldSize; if (iHorz < 0) { iHorz = 0; } iHorz += iNewSize;
// Get new vertical spacing
iVert = GetSystemMetrics (SM_CYICONSPACING); iVert -= iOldSize; if (iVert < 0) { iVert = 0; } iVert += iNewSize;
// Set New sizes and spacing
bRet = SetRegValueInt( HKEY_CURRENT_USER, HSUBKEY_WM, HVALUE_WMSIS, iNewSize ); if (!bRet) return FALSE;
SystemParametersInfo( SPI_ICONHORIZONTALSPACING, (WPARAM)iHorz, NULL, SPIF_UPDATEINIFILE ); SystemParametersInfo( SPI_ICONVERTICALSPACING, (WPARAM)iVert, NULL, SPIF_UPDATEINIFILE );
// Turn from Tri-State back to normal check box
if (iOldState == ICON_INDETERMINATE) { HWND hItem = GetDlgItem (hDlg, IDC_LARGEICONS); SendMessage( hItem, BM_SETSTYLE, (WPARAM)LOWORD(BS_AUTOCHECKBOX), MAKELPARAM( FALSE,0) ); }
// We did change the sizes
return TRUE; }
//
// ExtractPlusColorIcon
//
// Extract Icon from a file in proper Hi or Lo color for current system display
//
// from FrancisH on 6/22/95 with mods by TimBragg
HRESULT ExtractPlusColorIcon( LPCTSTR szPath, int nIndex, HICON *phIcon, UINT uSizeLarge, UINT uSizeSmall) { IShellLink *psl; HRESULT hres; HICON hIcons[2]; // MUST! - provide for TWO return icons
if ( !gfCoInitDone ) { if (SUCCEEDED(CoInitialize(NULL))) gfCoInitDone = TRUE; }
*phIcon = NULL; if (SUCCEEDED(hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&psl))) { if (SUCCEEDED(hres = psl->SetIconLocation(szPath, nIndex))) { IExtractIcon *pei; if (SUCCEEDED(hres = psl->QueryInterface(IID_IExtractIcon, (void**)&pei))) { if (SUCCEEDED(hres = pei->Extract(szPath, nIndex, &hIcons[0], &hIcons[1], (UINT)MAKEWPARAM((WORD)uSizeLarge, (WORD)uSizeSmall)))) { *phIcon = hIcons[0]; // Return first icon to caller
}
pei->Release(); } }
psl->Release(); }
return hres; } // end ExtractPlusColorIcon()
|