plustab.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 48k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. //  File: plustab.cpp
  4. //
  5. //  Main Implementation of the Effects page
  6. //
  7. //---------------------------------------------------------------------------
  8. #include "precomp.hxx"
  9. #include "shlwapip.h"
  10. #pragma hdrstop
  11. // OLE-Registry magic number
  12. GUID g_CLSID_CplExt = { 0x41e300e0, 0x78b6, 0x11ce,
  13.                         { 0x84, 0x9b, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}
  14.                       };
  15. //need to be L"..." since SHGetRestriction takes only LPCWSTR and this file is compiled as ANSI
  16. #define POLICY_KEY_EXPLORER       L"Explorer"
  17. #define POLICY_VALUE_ANIMATION    L"NoChangeAnimation"
  18. #define POLICY_VALUE_KEYBOARDNAV  L"NoChangeKeyboardNavigationIndicators"
  19. #define SPI_GETKEYBOARDINDICATORS SPI_GETMENUUNDERLINES//0x100A
  20. #define SPI_SETKEYBOARDINDICATORS SPI_SETMENUUNDERLINES//0x100B
  21. #define SPI_GETFONTCLEARTYPE      116
  22. #define SPI_SETFONTCLEARTYPE      117
  23. //Defines for getting registry settings
  24. const TCHAR c_szHICKey[] = TEXT("Control Panel\Desktop\WindowMetrics"); // show icons using highest possible colors
  25. const TCHAR c_szHICVal[] = TEXT("Shell Icon BPP"); // (4 if the checkbox is false, otherwise 16, don't set it to anything else)
  26. const TCHAR c_szSSKey[]  = TEXT("Control Panel\Desktop");
  27. const TCHAR c_szSSVal[]  = TEXT("SmoothScroll");
  28. const TCHAR c_szWMSISVal[] = TEXT("Shell Icon Size"); // Normal Icon Size (default 32 x 32)
  29. #ifdef INET_EXP_ICON
  30. const TCHAR c_szIEXP[]   = TEXT("\Program Files\Microsoft Internet Explorer 4");
  31. #endif
  32. #define ICON_DEFAULT_SMALL    16
  33. #define ICON_DEFAULT_NORMAL   32
  34. #define ICON_DEFAULT_LARGE    48
  35. enum ICON_SIZE_TYPES {
  36.    ICON_DEFAULT         = 0,
  37.    ICON_LARGE           = 1,
  38.    ICON_INDETERMINATE   = 2
  39. };
  40. #define MENU_EFFECT_FADE        1
  41. #define MENU_EFFECT_SCROLL      2
  42. #define FONT_SMOOTHING_STANDARD    0
  43. #define FONT_SMOOTHING_CLEARTYPE   1
  44. // Registry Info for the icons
  45. typedef struct tagIconRegKeys
  46. {
  47.     TCHAR szIconSubKey[128];
  48.     TCHAR szIconValue[16];
  49.     TCHAR szTitleSubKey[128];
  50.     int  iTitleResource;
  51.     int  iDefaultTitleResource;
  52.     BOOL bNTOnly;
  53. }ICONREGKEYS;
  54. ICONREGKEYS sIconRegKeys[] =
  55. {
  56.      // "My Computer" icon
  57.     { TEXT("CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon"),
  58.       TEXT(""),
  59.       TEXT("CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"),
  60.       NULL,
  61.       IDS_MYCOMPUTER,
  62.       FALSE
  63.     },
  64.     // "My Documents" icon
  65.     { TEXT("CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\DefaultIcon"),
  66.       TEXT(""),
  67.       TEXT("CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}"),
  68.       NULL,
  69.       IDS_MYDOCUMENTS,
  70.       FALSE
  71.      },
  72. // This one doesn't seem to pick up updates, so disable for now...
  73. #ifdef INET_EXP_ICON
  74.     // "Internet Explorer" icon
  75.     { TEXT("CLSID\{FBF23B42-E3F0-101B-8488-00AA003E56F8}\DefaultIcon"),
  76.       TEXT(""),
  77.       TEXT("CLSID\{FBF23B42-E3F0-101B-8488-00AA003E56F8}"),
  78.       NULL,
  79.       IDS_INTERNET
  80.      },
  81. #endif
  82.     // "Net Neighbourhood" icon
  83.     { TEXT("CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}\DefaultIcon"),
  84.       TEXT(""),
  85.       TEXT("CLSID\{208D2C60-3AEA-1069-A2D7-08002B30309D}"),
  86.       NULL,
  87.       IDS_NETNEIGHBOUR
  88.     },
  89.     // "Trash full" icon
  90.     { TEXT("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon"),
  91.       TEXT("full"),
  92.       TEXT("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}"),
  93.       IDS_FULL,
  94.       IDS_TRASHFULL
  95.      },
  96.      // "Trash empty" icon
  97.     { TEXT("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon"),
  98.       TEXT("empty"),
  99.       TEXT("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}"),
  100.       IDS_EMPTY,
  101.       IDS_TRASHEMPTY
  102.      },
  103.     //
  104.     // This is not a desktop icon, so for now it's not included.
  105.     //
  106. /*
  107.     // "Directory" icon
  108.     { TEXT("CLSID\{FE1290F0-CFBD-11CF-A330-00AA00C16E65}\DefaultIcon"),
  109.       TEXT(""),
  110.       TEXT("CLSID\{FE1290F0-CFBD-11CF-A330-00AA00C16E65}"),
  111.       NULL,
  112.       IDS_DIRECTORY
  113.     },
  114. */
  115. };
  116. #define NUM_ICONS (ARRAYSIZE(sIconRegKeys))
  117. #define PATH_WIN  0
  118. #define PATH_SYS  1
  119. #define PATH_IEXP 2
  120. typedef struct tagDefIcons
  121. {
  122.     int     iIndex;
  123.     UINT    uPath;
  124.     TCHAR   szFile[16];
  125. }DEFICONS;
  126. DEFICONS sDefaultIcons[NUM_ICONS] =
  127. {
  128.     { 0,PATH_WIN ,TEXT("\EXPLORER.EXE")},  // "My Computer" default icon
  129.     { 0,PATH_SYS ,TEXT("\mydocs.dll")},    // "My Documents" default icon
  130. #ifdef INET_EXP_ICON
  131.     { 0,PATH_IEXP,TEXT("\iexplore.exe")},  // "Internet Explorer" default icon
  132. #endif
  133.     {17,PATH_SYS, TEXT("\shell32.dll")},   // "Net Neighbourhood" default icon
  134.     {32,PATH_SYS, TEXT("\shell32.dll")},   // "Trash full" default icon
  135.     {31,PATH_SYS, TEXT("\shell32.dll")},   // "Trash empty" default icon
  136. //    { 0,TEXT("\dsfolder.dll")},  // "Directory" default icon
  137. };
  138. // Name of the file that holds each icon, and an index for which icon to use in the file
  139. typedef struct tagIconKeys
  140. {
  141.     TCHAR szOldFile[MAX_PATH];
  142.     int   iOldIndex;
  143.     TCHAR szNewFile[MAX_PATH];
  144.     int   iNewIndex;
  145. }ICONDATA;
  146. ICONDATA sIconData[NUM_ICONS];
  147. typedef struct
  148. {
  149.     DWORD dwControlID;
  150.     DWORD dwHelpContextID;
  151. }POPUP_HELP_ARRAY;
  152. POPUP_HELP_ARRAY phaMainDisplay[] = {
  153.    { (DWORD)IDC_ICONS,              (DWORD)IDH_DISPLAY_EFFECTS_DESKTOP_ICONS },
  154.    { (DWORD)IDC_CHANGEICON,         (DWORD)IDH_DISPLAY_EFFECTS_CHANGE_ICON_BUTTON },
  155.    { (DWORD)IDC_LARGEICONS,         (DWORD)IDH_DISPLAY_EFFECTS_LARGE_ICONS_CHECKBOX },
  156.    { (DWORD)IDC_ICONHIGHCOLOR,      (DWORD)IDH_DISPLAY_EFFECTS_ALL_COLORS_CHECKBOX  },
  157.    { (DWORD)IDC_ICONDEFAULT,        (DWORD)IDH_DISPLAY_EFFECTS_DEFAULT_ICON_BUTTON },
  158.    { (DWORD)IDC_MENUANIMATION,      (DWORD)IDH_DISPLAY_EFFECTS_ANIMATE_WINDOWS },
  159.    { (DWORD)IDC_FONTSMOOTH,         (DWORD)IDH_DISPLAY_EFFECTS_SMOOTH_FONTS_CHECKBOX },
  160.    { (DWORD)IDC_SHOWDRAG,           (DWORD)IDH_DISPLAY_EFFECTS_DRAG_WINDOW_CHECKBOX },
  161.    { (DWORD)IDC_KEYBOARDINDICATORS, (DWORD)IDH_DISPLAY_EFFECTS_HIDE_KEYBOARD_INDICATORS },
  162.    { (DWORD)IDC_GRPBOX_1,           (DWORD)IDH_COMM_GROUPBOX                 },
  163.    { (DWORD)IDC_GRPBOX_2,           (DWORD)IDH_COMM_GROUPBOX                 },
  164.    { (DWORD)IDC_COMBOEFFECT,        (DWORD)IDH_DISPLAY_EFFECTS_ANIMATE_LISTBOX },
  165.    { (DWORD)IDC_COMBOFSMOOTH,       (DWORD)IDH_DISPLAY_EFFECTS_SMOOTH_FONTS_LISTBOX },
  166.    { (DWORD)0, (DWORD)0 },
  167.    { (DWORD)0, (DWORD)0 },          // double-null terminator NECESSARY!
  168. };
  169. POPUP_HELP_ARRAY phaMainWinPlus[] = {
  170.    { (DWORD)IDC_ICONS,                          (DWORD)IDH_PLUS_PLUSPACK_LIST         },
  171.    { (DWORD)IDC_CHANGEICON,                     (DWORD)IDH_PLUS_PLUSPACK_CHANGEICON   },
  172.    { (DWORD)IDC_LARGEICONS,                     (DWORD)IDH_PLUS_PLUSPACK_LARGEICONS   },
  173.    { (DWORD)IDC_ICONHIGHCOLOR,                  (DWORD)IDH_PLUS_PLUSPACK_ALLCOLORS    },
  174.    { (DWORD)IDC_GRPBOX_1,                       (DWORD)IDH_COMM_GROUPBOX              },
  175.    { (DWORD)IDC_GRPBOX_2,                       (DWORD)IDH_COMM_GROUPBOX              },
  176.    { (DWORD)0, (DWORD)0 },
  177.    { (DWORD)0, (DWORD)0 },          // double-null terminator NECESSARY!
  178. };
  179. POPUP_HELP_ARRAY * g_phaHelp = NULL;
  180. HWND hWndList;          // handle to the list view window
  181. HIMAGELIST hIconList;   // handles to image lists for large icons
  182. // Handle to the DLL
  183. extern HINSTANCE g_hInst;
  184. BOOL g_bMirroredOS = FALSE;
  185. // vars needed for new shell api
  186. #define SZ_SHELL32                  TEXT("shell32.dll")
  187. #define SZ_SHUPDATERECYCLEBINICON   "SHUpdateRecycleBinIcon"    // Parameter for GetProcAddr()... DO NOT TEXT("") IT!
  188. HINSTANCE hmodShell32 = NULL;
  189. typedef void (* PFNSHUPDATERECYCLEBINICON)( void );
  190. PFNSHUPDATERECYCLEBINICON pfnSHUpdateRecycleBinIcon = NULL;
  191. // Function prototype
  192. BOOL CALLBACK PlusPackDlgProc( HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam );
  193. HWND CreateListView( HWND hWndParent );
  194. // Icon Stuff
  195. int   GetIconState (void);
  196. BOOL  ChangeIconSizes (HWND hDlg, int iOldState, int iNewState);
  197. HRESULT ExtractPlusColorIcon(LPCTSTR szPath, int nIndex, HICON *phIcon, UINT uSizeLarge, UINT uSizeSmall);
  198. BOOL  gfCoInitDone = FALSE;         // track state of OLE CoInitialize()
  199. // animation stuff
  200. WPARAM GetAnimations(DWORD *pdwEffect);
  201. void SetAnimations(WPARAM wVal, DWORD dwEffect);
  202. BOOL DisplayFontSmoothingDetails(DWORD *pdwSetting)
  203. {
  204.     return FALSE;
  205. }
  206. BOOL FadeEffectAvailable()
  207. {
  208.     BOOL fFade = FALSE, fTestFade = FALSE;
  209.     
  210.     SystemParametersInfo( SPI_GETMENUFADE, 0, (PVOID)&fFade, 0 );
  211.     if (fFade) 
  212.         return TRUE;
  213.     
  214.     SystemParametersInfo( SPI_SETMENUFADE, 0, (PVOID)1, 0);
  215.     SystemParametersInfo( SPI_GETMENUFADE, 0, (PVOID)&fTestFade, 0 );
  216.     SystemParametersInfo( SPI_SETMENUFADE, 0, (PVOID)fFade, 0);
  217.     return (fTestFade);
  218. }
  219. //---------------------------------------------------------------------------
  220. //
  221. // PropertySheeDlgProc()
  222. //
  223. //  The dialog procedure for the "PlusPack" property sheet page.
  224. //
  225. //---------------------------------------------------------------------------
  226. BOOL CALLBACK PropertySheeDlgProc( HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam )
  227. {
  228.     LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE)GetWindowLongPtr( hDlg, DWLP_USER );
  229.     static int      iOldLI, iNewLI;         // Large Icon State
  230.     static int      iOldHIC, iNewHIC;       // High Icon Colour
  231.     static WPARAM   wOldMA, wNewMA;         // Menu Animation State
  232.     static BOOL     bOldSF, bNewSF;         // Font Smoothing State
  233.     static DWORD    dwOldSFT, dwNewSFT;     // Font Smoothing Type
  234.     static BOOL     bOldDW, bNewDW;         // Drag Window State
  235.     static BOOL     uOldKI, uNewKI;         // Keyboard Indicators
  236.     BOOL            bDorked = FALSE, bRet;
  237.     static int      iIndex, iX;
  238.     static TCHAR    szHelpFile[32];
  239.     TCHAR           szRes[100];
  240.     HWND            hwndCombo;
  241.     static DWORD    dwOldEffect, dwNewEffect; 
  242.     switch( uMessage )
  243.     {
  244.         case WM_INITDIALOG:
  245.         {
  246.             UINT id = IDS_HELPFILE_PLUS;
  247.     
  248.             g_bMirroredOS = IS_MIRRORING_ENABLED();
  249.             // Create our list view and fill it with the system icons
  250.             CreateListView( hDlg );
  251.             iIndex = 0;
  252.             SetWindowLongPtr( hDlg, DWLP_USER, lParam );
  253.             psp = (LPPROPSHEETPAGE)lParam;
  254.             // Get the name of our help file.  For Memphis, it's
  255.             // IDS_HELPFILE_PLUS for NT it's IDS_HELPFILE.
  256.             g_phaHelp = phaMainWinPlus;
  257.             // If running on NT...
  258.             if ((int)GetVersion() >= 0)
  259.             {
  260.                 id = IDS_HELPFILE;
  261.                 g_phaHelp = phaMainDisplay;
  262.             }
  263.             LoadString( g_hInst, id, szHelpFile, 32 );
  264.             // Get the values for the settings from the registry and set the checkboxes
  265.             // Large Icons
  266.             iOldLI = GetIconState ();
  267.             if (iOldLI == ICON_INDETERMINATE)
  268.             {
  269.                 HWND hItem = GetDlgItem (hDlg, IDC_LARGEICONS);
  270.                 SendMessage( hItem,
  271.                              BM_SETSTYLE,
  272.                              (WPARAM)LOWORD(BS_AUTO3STATE),
  273.                              MAKELPARAM( FALSE,0)
  274.                             );
  275.             }
  276.             iNewLI = iOldLI;
  277.             SendMessage( (HWND)GetDlgItem( hDlg, IDC_LARGEICONS ),
  278.                          BM_SETCHECK,
  279.                          (WPARAM)iOldLI,
  280.                          0
  281.                         );
  282.             // Full Color Icons
  283.             bRet = GetRegValueInt( HKEY_CURRENT_USER,
  284.                                    c_szHICKey,
  285.                                    c_szHICVal,
  286.                                    &iOldHIC
  287.                                   );
  288.             if( bRet == FALSE ) // Key not in registry yet
  289.             {
  290.                 iOldHIC = iNewHIC = 4;
  291.             }
  292.             iNewHIC = iOldHIC;
  293.             SendMessage( (HWND)GetDlgItem( hDlg, IDC_ICONHIGHCOLOR ),
  294.                          BM_SETCHECK,
  295.                          (WPARAM)(BOOL)(iOldHIC == 16),
  296.                          0
  297.                         );
  298.             
  299.             hwndCombo = GetDlgItem(hDlg,IDC_COMBOEFFECT); 
  300.             ComboBox_ResetContent(hwndCombo);
  301.             LoadString (g_hInst, IDS_FADEEFFECT, szRes, ARRAYSIZE(szRes) );
  302.             ComboBox_AddString(hwndCombo, szRes);
  303.             LoadString (g_hInst, IDS_SCROLLEFFECT, szRes, ARRAYSIZE(szRes) );
  304.             ComboBox_AddString(hwndCombo, szRes);
  305.             // Use animations
  306.             wOldMA = GetAnimations(&dwOldEffect);
  307.             SendMessage( (HWND)GetDlgItem( hDlg, IDC_MENUANIMATION ),
  308.                          BM_SETCHECK,
  309.                          (WPARAM)wOldMA,
  310.                          0
  311.                         );
  312.             ComboBox_SetCurSel(hwndCombo, (MENU_EFFECT_FADE == dwOldEffect) ? 0 : 1);
  313.              
  314.             wNewMA = wOldMA;
  315.             dwNewEffect = dwOldEffect;
  316.             
  317.             EnableWindow( GetDlgItem( hDlg, IDC_COMBOEFFECT ),
  318.                 (UINT)wOldMA);
  319.             if (!FadeEffectAvailable()) 
  320.                 ShowWindow(GetDlgItem( hDlg, IDC_COMBOEFFECT ), SW_HIDE);
  321.             if(0!=SHGetRestriction(NULL,POLICY_KEY_EXPLORER,POLICY_VALUE_ANIMATION))
  322.             {//disable
  323.                 //0=     enable
  324.                 //non-0= disable
  325.                 //relies on the fact that if the key does not exist it returns 0 as well
  326.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_MENUANIMATION ),
  327.                     FALSE);
  328.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_COMBOEFFECT ),
  329.                     FALSE);
  330.             }
  331.             hwndCombo = GetDlgItem(hDlg,IDC_COMBOFSMOOTH); 
  332. #ifdef CLEARTYPECOMBO
  333.             ComboBox_ResetContent(hwndCombo);
  334.             LoadString (g_hInst, IDS_STANDARDSMOOTHING, szRes, ARRAYSIZE(szRes) );
  335.             ComboBox_AddString(hwndCombo, szRes);
  336.             LoadString (g_hInst, IDS_CLEARTYPE, szRes, ARRAYSIZE(szRes) );
  337.             ComboBox_AddString(hwndCombo, szRes);
  338. #else
  339.             ShowWindow(hwndCombo, SW_HIDE);
  340.             ShowWindow(GetDlgItem(hDlg, IDC_SHOWME), SW_HIDE);
  341. #endif //CLEARTYPECOMBO
  342.             // Smooth edges of screen fonts
  343.             bOldSF = FALSE;
  344.             SystemParametersInfo( SPI_GETFONTSMOOTHING, 0, (PVOID)&bOldSF, 0 );
  345.             SendMessage( (HWND)GetDlgItem( hDlg, IDC_FONTSMOOTH ),
  346.                          BM_SETCHECK,
  347.                          (WPARAM)bOldSF,
  348.                          0
  349.                         );
  350.             bNewSF = bOldSF;
  351.             dwOldSFT = FONT_SMOOTHING_STANDARD;
  352. #ifdef CLEARTYPECOMBO
  353.             if (SystemParametersInfo( SPI_GETFONTCLEARTYPE, 0, (PVOID)&bSmoothType, 0 )) 
  354.             {
  355.                 dwOldSFT = (bSmoothType ? FONT_SMOOTHING_CLEARTYPE : FONT_SMOOTHING_STANDARD);
  356.                 ComboBox_SetCurSel(hwndCombo, dwOldSFT);
  357.                 EnableWindow((HWND)hwndCombo, bOldSF);
  358.             }
  359.             else
  360.             {
  361.                 ComboBox_SetCurSel(hwndCombo, FONT_SMOOTHING_STANDARD);
  362.                 ShowWindow(hwndCombo, SW_HIDE);
  363.                 ShowWindow(GetDlgItem(hDlg, IDC_SHOWME), SW_HIDE);
  364.             }
  365. #endif //CLEARTYPECOMBO
  366.             dwNewSFT = dwOldSFT;
  367.             
  368.             // Show contents while dragging
  369.             bOldDW = FALSE;
  370.             SystemParametersInfo( SPI_GETDRAGFULLWINDOWS, 0, (PVOID)&bOldDW, 0 );
  371.             SendMessage( (HWND)GetDlgItem( hDlg, IDC_SHOWDRAG ),
  372.                          BM_SETCHECK,
  373.                          (WPARAM)bOldDW,
  374.                          0
  375.                         );
  376.             bNewDW = bOldDW;
  377.             
  378.             uOldKI = FALSE;
  379.             SystemParametersInfo( SPI_GETKEYBOARDINDICATORS, 0, (PVOID)&uOldKI, 0 );
  380.             SendMessage( (HWND)GetDlgItem( hDlg, IDC_KEYBOARDINDICATORS ),
  381.                          BM_SETCHECK,
  382.                          (WPARAM)(uOldKI ? BST_UNCHECKED : BST_CHECKED),
  383.                          0
  384.                         );
  385.             uNewKI = uOldKI;
  386.             if(0!=SHGetRestriction(NULL,POLICY_KEY_EXPLORER,POLICY_VALUE_KEYBOARDNAV))
  387.             {//disable, see comment for animation
  388.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_KEYBOARDINDICATORS ),
  389.                     FALSE);
  390.             }
  391.             // Load SHUpdateRecycleBinIcon() if it exists
  392.             hmodShell32 = LoadLibrary(SZ_SHELL32);
  393.             pfnSHUpdateRecycleBinIcon = (PFNSHUPDATERECYCLEBINICON)GetProcAddress( hmodShell32, SZ_SHUPDATERECYCLEBINICON );
  394.             //disable and uncheck things if we are on terminal server
  395.             BOOL bEffectsEnabled;
  396.             SystemParametersInfo(SPI_GETUIEFFECTS, 0, (PVOID)&bEffectsEnabled, 0);
  397.             if (!bEffectsEnabled || SHGetMachineInfo(GMI_TSCLIENT))
  398.             {
  399.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_MENUANIMATION ),
  400.                     FALSE);
  401.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_ICONHIGHCOLOR ),
  402.                     FALSE);
  403.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_KEYBOARDINDICATORS ),
  404.                     FALSE);
  405.                 EnableWindow( (HWND)GetDlgItem( hDlg, IDC_FONTSMOOTH),
  406.                     FALSE);
  407.                 ShowWindow(GetDlgItem( hDlg, IDC_COMBOEFFECT ), SW_HIDE);
  408.                 SendDlgItemMessage(hDlg, IDC_MENUANIMATION, BM_SETCHECK, 0, 0);
  409.                 SendDlgItemMessage(hDlg, IDC_ICONHIGHCOLOR, BM_SETCHECK, 0, 0);
  410.                 SendDlgItemMessage(hDlg, IDC_KEYBOARDINDICATORS, BM_SETCHECK, 0, 0);
  411.                 SendDlgItemMessage(hDlg, IDC_FONTSMOOTH, BM_SETCHECK, 0, 0);
  412.                    
  413.             }
  414.         }
  415.         break;
  416.         case WM_DESTROY:
  417.             if ( gfCoInitDone )
  418.                 CoUninitialize();
  419.             if (hmodShell32)
  420.                 FreeLibrary(hmodShell32);
  421.             break;
  422.         case WM_COMMAND:
  423.             switch( LOWORD(wParam) )
  424.             {
  425.                 case IDC_LARGEICONS:
  426.                     iNewLI = (int)SendMessage ( (HWND)lParam, BM_GETCHECK, 0, 0 );
  427.                     bDorked = TRUE;
  428.                     break;
  429.                 case IDC_ICONHIGHCOLOR:
  430.                     iNewHIC = 4;
  431.                     if( SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == TRUE )
  432.                     {
  433.                         iNewHIC = 16;
  434.                     }
  435.                     bDorked = TRUE;
  436.                     break;
  437.                 case IDC_SHOWDRAG:
  438.                     bNewDW = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED);
  439.                     bDorked = TRUE;
  440.                     break;
  441.                 case IDC_MENUANIMATION:
  442.                     switch( wNewMA )
  443.                     {
  444.                     case BST_UNCHECKED:
  445.                         wNewMA = BST_CHECKED;
  446.                         break;
  447.                     case BST_CHECKED:
  448.                         wNewMA = BST_UNCHECKED;
  449.                         break;
  450.                     case BST_INDETERMINATE:
  451.                         wNewMA = BST_UNCHECKED;
  452.                         break;
  453.                     }
  454.                     SendMessage( (HWND)lParam, BM_SETCHECK, (WPARAM)wNewMA, 0 );
  455.                     EnableWindow((HWND)GetDlgItem( hDlg, IDC_COMBOEFFECT), (BST_CHECKED == wNewMA));
  456.                     bDorked = TRUE;
  457.                     break;
  458.                 case IDC_COMBOEFFECT:
  459.                     if(HIWORD(wParam) == CBN_SELCHANGE)
  460.                     {
  461.                         dwNewEffect = (DWORD)ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBOEFFECT)) + 1;
  462.                         bDorked = TRUE;
  463.                     }
  464.                     break;
  465.                     
  466. #ifdef CLEARTYPECOMBO
  467.                 case IDC_COMBOFSMOOTH:
  468.                     if(HIWORD(wParam) == CBN_SELCHANGE)
  469.                     {
  470.                         dwNewSFT = (DWORD)ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBOFSMOOTH));
  471.                         bDorked = TRUE;
  472.                     }
  473.                     break;
  474. #endif                    
  475.                 case IDC_FONTSMOOTH:
  476.                     bNewSF = (SendMessage( (HWND)lParam, BM_GETCHECK, 0, 0 ) == BST_CHECKED);
  477. #ifdef CLEARTYPECOMBO
  478.                     EnableWindow((HWND)GetDlgItem( hDlg, IDC_COMBOFSMOOTH), bNewSF);
  479. #endif
  480.                     bDorked = TRUE;
  481.                     break;
  482.                 case IDC_CHANGEICON:
  483.                 {
  484.                     INT i = sIconData[iIndex].iOldIndex;
  485.                     WCHAR szTemp[ MAX_PATH ];
  486.                     TCHAR szExp[ MAX_PATH ];
  487.                     ExpandEnvironmentStrings( sIconData[iIndex].szOldFile,
  488.                                               szExp,
  489.                                               ARRAYSIZE(szExp)
  490.                                              );
  491.                     if (g_RunningOnNT)
  492.                     {
  493.                         SHTCharToUnicode(szExp, szTemp, ARRAYSIZE(szTemp));
  494.                     }
  495.                     else
  496.                     {
  497.                         SHTCharToAnsi(szExp, (LPSTR)szTemp, ARRAYSIZE(szTemp));
  498.                     }
  499.                     if ( PickIconDlg( hDlg,
  500.                                       (LPTSTR)szTemp,
  501.                                       ARRAYSIZE(szTemp),
  502.                                       &i
  503.                                      ) == TRUE
  504.                         )
  505.                     {
  506.                         HICON hIcon;
  507.                         if (g_RunningOnNT)
  508.                         {
  509.                             SHUnicodeToTChar(szTemp,
  510.                                              sIconData[iIndex].szNewFile,
  511.                                              ARRAYSIZE(sIconData[iIndex].szNewFile));
  512.                         }
  513.                         else
  514.                         {
  515.                             SHAnsiToTChar((LPSTR)szTemp,
  516.                                           sIconData[iIndex].szNewFile,
  517.                                           ARRAYSIZE(sIconData[iIndex].szNewFile));
  518.                         }
  519.                         sIconData[iIndex].iNewIndex = i;
  520.                         ExtractPlusColorIcon( sIconData[iIndex].szNewFile,
  521.                                               sIconData[iIndex].iNewIndex,
  522.                                               &hIcon,
  523.                                               0,
  524.                                               0
  525.                                              );
  526.                         ImageList_ReplaceIcon( hIconList, iIndex, hIcon );
  527.                         ListView_RedrawItems( hWndList, iIndex, iIndex );
  528.                         bDorked = TRUE;
  529.                     }
  530.                     SetFocus( hWndList );
  531.                 }
  532.                     break;
  533.                 case IDC_ICONDEFAULT:
  534.                     {
  535.                         TCHAR szTemp[_MAX_PATH];
  536.                         HICON hIcon;
  537.                         switch( sDefaultIcons[iIndex].uPath )
  538.                         {
  539.                             case PATH_WIN:
  540.                                 GetWindowsDirectory( szTemp, ARRAYSIZE(szTemp) );
  541.                                 break;
  542. #ifdef INET_EXP_ICON
  543.                             case PATH_IEXP:
  544.                                 if (g_RunningOnNT)
  545.                                 {
  546.                                     lstrcpy( szTemp, TEXT("%SystemDrive%") );
  547.                                 }
  548.                                 else
  549.                                 {
  550.                                     GetWindowsDirectory( szTemp, ARRAYSIZE(szTemp) );
  551.                                     //
  552.                                     // Clear out path after drive, ie: C:
  553.                                     //
  554.                                     szTemp[ 2 ] = 0;
  555.                                 }
  556.                                 lstrcat( szTemp, c_szIEXP );
  557.                                 break;
  558. #endif
  559.                             case PATH_SYS:
  560.                             default:
  561.                                 GetSystemDirectory( szTemp, ARRAYSIZE(szTemp) );
  562.                                 break;
  563.                         }
  564.                         lstrcat( szTemp,  sDefaultIcons[iIndex].szFile );
  565.                         lstrcpy( sIconData[iIndex].szNewFile, szTemp );
  566.                         sIconData[iIndex].iNewIndex = sDefaultIcons[iIndex].iIndex;
  567.                         ExtractPlusColorIcon( sIconData[iIndex].szNewFile,
  568.                                               sIconData[iIndex].iNewIndex,
  569.                                               &hIcon,
  570.                                               0,
  571.                                               0
  572.                                              );
  573.                         ImageList_ReplaceIcon( hIconList, iIndex, hIcon );
  574.                         ListView_RedrawItems( hWndList, iIndex, iIndex );
  575.                         bDorked = TRUE;
  576.                         SetFocus( hWndList );
  577.                     }
  578.                     break;
  579.                 case IDC_KEYBOARDINDICATORS:
  580.                     uNewKI = ((SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)?
  581.                                                 FALSE : TRUE);
  582.                     bDorked = TRUE;
  583.                     break;
  584.                 default:
  585.                     break;
  586.             }
  587.             // If the user dorked with a setting, tell the property manager we
  588.             // have outstanding changes. This will enable the "Apply Now" button...
  589.             if( bDorked )
  590.             {
  591.                 SendMessage( GetParent( hDlg ), PSM_CHANGED, (WPARAM)hDlg, 0L );
  592.             }
  593.             break;
  594.         case WM_NOTIFY:
  595.             switch( ((NMHDR *)lParam)->code )
  596.             {   
  597. #ifdef CLEARTYPECOMBO
  598.                 case NM_CLICK:
  599.                     switch (wParam)
  600.                     {
  601.                         case IDC_SHOWME:
  602.                             DWORD dwSmoothingSetting = dwNewSFT;
  603.                             if (DisplayFontSmoothingDetails(&dwSmoothingSetting) &&
  604.                                 dwNewSFT != dwSmoothingSetting)
  605.                             {
  606.                                 dwNewSFT = dwSmoothingSetting;
  607.                                 bDorked = TRUE;
  608.                                 SendMessage( GetParent( hDlg ), PSM_CHANGED, (WPARAM)hDlg, 0L );
  609.                                 // TODO: reset the controls
  610.                             }
  611.                             break;
  612.                     }
  613.                     break;
  614. #endif                    
  615.                 case LVN_ITEMCHANGED:   // The selection changed in our listview
  616.                     if( wParam == IDC_ICONS )
  617.                     {
  618.                         // Find out who's selected now
  619.                         for( iIndex = 0; iIndex < NUM_ICONS;iIndex++ )
  620.                         {
  621.                             if( ListView_GetItemState( hWndList, iIndex, LVIS_SELECTED ) )
  622.                             {
  623.                                 break;
  624.                             }
  625.                         }
  626.                     }
  627.                     break;
  628.                 case PSN_APPLY: // OK or Apply clicked
  629.                 {
  630.                     HDC hDC = GetDC( NULL );
  631.                     int iBitsPerPixel;
  632.                     iBitsPerPixel = GetDeviceCaps( hDC, BITSPIXEL );
  633.                     ReleaseDC( NULL, hDC );
  634.                     // Large Icons
  635.                     BOOL bSendSettingsChange = ChangeIconSizes (hDlg, iOldLI, iNewLI);
  636.                     if (bSendSettingsChange)
  637.                     {
  638.                         iOldLI = iNewLI;
  639.                         bDorked = TRUE;
  640.                     }
  641.                     // Full Color Icons
  642.                     if( iOldHIC != iNewHIC )
  643.                     {
  644.                         TCHAR szTemp1[512];
  645.                         TCHAR szTemp2[256];
  646.                         bRet = SetRegValueInt( HKEY_CURRENT_USER,
  647.                                                c_szHICKey,
  648.                                                c_szHICVal,
  649.                                                iNewHIC
  650.                                               );
  651.                         iOldHIC = iNewHIC;
  652.                         if ((iBitsPerPixel < 16) && (iNewHIC == 16)) // Display mode won't support icon high colors
  653.                         {
  654.                             LoadString (g_hInst, IDS_256COLORPROBLEM, szTemp1, ARRAYSIZE(szTemp1) );
  655.                             LoadString( g_hInst, IDS_ICONCOLORWONTWORK, szTemp2, ARRAYSIZE(szTemp2) );
  656.                             lstrcat (szTemp1, szTemp2);
  657.                             LoadString(g_hInst, IDS_EFFECTS, szTemp2, ARRAYSIZE(szTemp2) );
  658.                             MessageBox( hDlg, szTemp1, szTemp2, MB_OK|MB_ICONINFORMATION );
  659.                         }
  660.                         else
  661.                         {
  662.                            bSendSettingsChange = TRUE;
  663.                         }
  664.                     }
  665.                     // Full window drag
  666.                     if ( bOldDW != bNewDW )
  667.                     {
  668.                         bOldDW = bNewDW;
  669.                         SystemParametersInfo( SPI_SETDRAGFULLWINDOWS,
  670.                                               bNewDW,
  671.                                               0,
  672.                                               SPIF_UPDATEINIFILE
  673.                                              );
  674.                         // we need to send this because the tray's autohide switches off this
  675.                         bSendSettingsChange = TRUE;
  676.                     }
  677.                     // Font smoothing
  678.                     if ( bOldSF != bNewSF || dwOldSFT != dwNewSFT)
  679.                     {
  680. #ifdef CLEARTYPECOMBO
  681.                         BOOL bST;
  682.                         bST = (dwNewSFT == FONT_SMOOTHING_CLEARTYPE);
  683.                         SystemParametersInfo( SPI_SETFONTCLEARTYPE,
  684.                                               bST,
  685.                                               0,
  686.                                               SPIF_UPDATEINIFILE
  687.                                              );
  688. #endif
  689.                         dwOldSFT = dwNewSFT;
  690.                         bOldSF = bNewSF;
  691.                         SystemParametersInfo( SPI_SETFONTSMOOTHING,
  692.                                               bNewSF,
  693.                                               0,
  694.                                               SPIF_UPDATEINIFILE
  695.                                              );
  696.                     }
  697.                     // Menu animations
  698.                     if ( wOldMA != wNewMA || dwOldEffect != dwNewEffect)
  699.                     {
  700.                         wOldMA = wNewMA;
  701.                         SetAnimations( wNewMA, dwNewEffect );
  702.                         dwOldEffect = dwNewEffect;
  703.                     }
  704.                     // Change the system icons
  705.                     for( iX = 0;iX < NUM_ICONS;iX++ )
  706.                     {
  707.                         if( (lstrcmpi( sIconData[iX].szNewFile, sIconData[iX].szOldFile ) != 0) ||
  708.                             (sIconData[iX].iNewIndex != sIconData[iX].iOldIndex)
  709.                            )
  710.                         {
  711.                             TCHAR   szTemp[MAX_PATH];
  712.                             wnsprintf( szTemp, ARRAYSIZE(szTemp),
  713.                                       TEXT("%s,%d"),
  714.                                       sIconData[iX].szNewFile,
  715.                                       sIconData[iX].iNewIndex
  716.                                      );
  717.                             bRet = IconSetRegValueString( sIconRegKeys[iX].szIconSubKey,
  718.                                                           sIconRegKeys[iX].szIconValue,
  719.                                                           (LPTSTR)szTemp
  720.                                                          );
  721.                             // Next two lines necessary if the user does an Apply as opposed to OK
  722.                             lstrcpy( sIconData[iX].szOldFile, sIconData[iX].szNewFile );
  723.                             sIconData[iX].iOldIndex = sIconData[iX].iNewIndex;
  724.                             bDorked = TRUE;
  725.                         }
  726.                     }
  727.                     // Keyboard indicators
  728.                     if ( uOldKI != uNewKI )
  729.                     {
  730.                         uOldKI = uNewKI;
  731.                         DWORD_PTR dwResult;
  732.                         // Are we turning this on? (!uNewKI means "don't show" -> hide)
  733.                         if (!uNewKI)
  734.                         {
  735.                             // Yes, on: hide the key cues, turn on the mechanism
  736.                             SystemParametersInfo(SPI_SETKEYBOARDINDICATORS, 0,
  737.                                (PVOID)uNewKI, SPIF_UPDATEINIFILE);
  738.                             SendMessageTimeout(HWND_BROADCAST, WM_CHANGEUISTATE, 
  739.                                 MAKEWPARAM(UIS_SET, UISF_HIDEFOCUS | UISF_HIDEACCEL),
  740.                                 0, SMTO_ABORTIFHUNG, 10*1000, &dwResult);
  741.                         }
  742.                         else
  743.                         {
  744.                             // No, off: means show the keycues, turn off the mechanism
  745.                             SendMessageTimeout(HWND_BROADCAST, WM_CHANGEUISTATE, 
  746.                                 MAKEWPARAM(UIS_CLEAR, UISF_HIDEFOCUS | UISF_HIDEACCEL),
  747.                                 0, SMTO_ABORTIFHUNG, 10*1000, &dwResult);
  748.                             SystemParametersInfo(SPI_SETKEYBOARDINDICATORS, 0,
  749.                                (PVOID)uNewKI, SPIF_UPDATEINIFILE);
  750.                         }
  751.                     }
  752.                     // Make the system notice we changed the system icons
  753.                     if( bDorked )
  754.                     {
  755.                         SHChangeNotify( SHCNE_ASSOCCHANGED, 0, NULL, NULL ); // should do the trick!
  756.                         if (pfnSHUpdateRecycleBinIcon != NULL)
  757.                         {
  758.                             pfnSHUpdateRecycleBinIcon();
  759.                         }
  760.                     }
  761.                     if (bSendSettingsChange)
  762.                     {
  763.                         DWORD_PTR dwResult = 0;
  764.                         SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0,
  765.                             SMTO_ABORTIFHUNG, 10*1000, &dwResult);
  766.                     }
  767.                     break;
  768.                 }
  769.                 default:
  770.                     break;
  771.             }
  772.             break;
  773.         case WM_HELP:
  774.         {
  775.             LPHELPINFO lphi = (LPHELPINFO)lParam;
  776.             if( lphi->iContextType == HELPINFO_WINDOW )
  777.             {
  778.                 WinHelp( (HWND)lphi->hItemHandle,
  779.                          (LPTSTR)szHelpFile,
  780.                          HELP_WM_HELP,
  781.                          (DWORD_PTR)((POPUP_HELP_ARRAY FAR *)g_phaHelp)
  782.                         );
  783.             }
  784.         }
  785.             break;
  786.         case WM_CONTEXTMENU:
  787.             // first check for dlg window
  788.             if( (HWND)wParam == hDlg )
  789.             {
  790.                 // let the def dlg proc decide whether to respond or ignore;
  791.                 // necessary for title bar sys menu on right click
  792.                 return FALSE;       // didn't process message EXIT
  793.             }
  794.             else
  795.             {
  796.                 // else go for the controls
  797.                 WinHelp( (HWND)wParam,
  798.                          (LPTSTR)szHelpFile,
  799.                          HELP_CONTEXTMENU,
  800.                          (DWORD_PTR)((POPUP_HELP_ARRAY FAR *)g_phaHelp)
  801.                         );
  802.             }
  803.             break;
  804.         default:
  805.             return FALSE;
  806.     }
  807.     return(TRUE);
  808. }
  809. /****************************************************************************
  810. *
  811. *    FUNCTION: CreateListView(HWND)
  812. *
  813. *    PURPOSE:  Creates the list view window and initializes it
  814. *
  815. ****************************************************************************/
  816. HWND CreateListView( HWND hWndParent )
  817. {
  818.     LV_ITEM lvI;            // List view item structure
  819.     TCHAR   szTemp[MAX_PATH];
  820.     BOOL bEnable = FALSE;
  821. #ifdef JIGGLE_FIX
  822.     RECT rc;
  823. #endif
  824.     UINT flags = ILC_MASK | ILC_COLOR24;
  825.     // Create a device independant size and location
  826.     LONG lWndunits = GetDialogBaseUnits();
  827.     int iWndx = LOWORD(lWndunits);
  828.     int iWndy = HIWORD(lWndunits);
  829.     int iX = ((11 * iWndx) / 4);
  830.     int iY = ((15 * iWndy) / 8);
  831.     int iWidth = ((163 * iWndx) / 4);
  832.     int iHeight = ((40 * iWndy) / 8);
  833.     // Ensure that the common control DLL is loaded.
  834.     InitCommonControls();
  835.     // Get the list view window
  836.     hWndList = GetDlgItem (hWndParent, IDC_ICONS);
  837.     if( hWndList == NULL  )
  838.         return NULL;
  839.     if(IS_WINDOW_RTL_MIRRORED(hWndParent))
  840.     {
  841.         flags |= ILC_MIRROR;
  842.     }
  843.     // initialize the list view window
  844.     // First, initialize the image lists we will need
  845.     hIconList = ImageList_Create( 32, 32, flags, NUM_ICONS, 0 );   // create an image list for the icons
  846.     // load the icons and add them to the image lists
  847.     // get the icon files and indexes from the registry, including for the Default recycle bin
  848.     for( iX = 0; iX < NUM_ICONS; iX++ )
  849.     {
  850.         HICON hIcon;
  851.         BOOL bRet;
  852.         bRet = IconGetRegValueString( sIconRegKeys[iX].szIconSubKey,
  853.                                       sIconRegKeys[iX].szIconValue,
  854.                                       szTemp,
  855.                                       MAX_PATH
  856.                                      );
  857.         int iIndex = PathParseIconLocation( szTemp );
  858.         // store the icon information
  859.         lstrcpy( sIconData[iX].szOldFile, szTemp );
  860.         lstrcpy( sIconData[iX].szNewFile, szTemp );
  861.         sIconData[iX].iOldIndex = iIndex;
  862.         sIconData[iX].iNewIndex = iIndex;
  863.         ExtractPlusColorIcon( szTemp, iIndex, &hIcon, 0, 0);
  864.         // Added this "if" to fix bug 2831.  We want to use SHELL32.DLL
  865.         // icon 0 if there is no icon in the file specified in the
  866.         // registry (or if the registry didn't specify a file).
  867.         if( hIcon == NULL )
  868.         {
  869.             GetSystemDirectory( szTemp, sizeof(szTemp) );
  870.             lstrcat( szTemp,  TEXT("\shell32.dll") );
  871.             lstrcpy( sIconData[iX].szOldFile, szTemp );
  872.             lstrcpy( sIconData[iX].szNewFile, szTemp );
  873.             sIconData[iX].iOldIndex = sIconData[iX].iNewIndex = 0;
  874.             ExtractPlusColorIcon( szTemp, 0, &hIcon, 0, 0 );
  875.         }
  876.         if (ImageList_AddIcon( hIconList, hIcon ) == -1)
  877.         {
  878.             return NULL;
  879.         }
  880.     }
  881.     // Make sure that all of the icons were added
  882.     if( ImageList_GetImageCount( hIconList ) < NUM_ICONS )
  883.         return FALSE;
  884.     ListView_SetImageList( hWndList, hIconList, LVSIL_NORMAL );
  885.     // Make sure the listview has WS_HSCROLL set on it.
  886.     DWORD dwStyle = GetWindowLong( hWndList, GWL_STYLE );
  887.     SetWindowLong( hWndList, GWL_STYLE, (dwStyle & (~WS_VSCROLL)) | WS_HSCROLL );
  888.     // Finally, let's add the actual items to the control.  Fill in the LV_ITEM
  889.     // structure for each of the items to add to the list.  The mask specifies
  890.     // the the .pszText, .iImage, and .state members of the LV_ITEM structure are valid.
  891.     lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
  892.     lvI.state = 0;
  893.     lvI.stateMask = 0;
  894.     for( iX = 0; iX < NUM_ICONS; iX++ )
  895.     {
  896.         TCHAR szAppend[64];
  897.         BOOL bRet;
  898.         bRet = IconGetRegValueString( sIconRegKeys[iX].szTitleSubKey,
  899.                                       NULL,
  900.                                       (LPTSTR)szTemp,
  901.                                       MAX_PATH
  902.                                      );
  903.         // if the title string was in the registry, else we have to use the default in our resources
  904.         if( (bRet) && (lstrlen(szTemp) > 0) )
  905.         {
  906.             if( LoadString( g_hInst, sIconRegKeys[iX].iTitleResource, szAppend, 64 ) != 0 )
  907.             {
  908.                 lstrcat( szTemp, szAppend );
  909.             }
  910.         }
  911.         else
  912.         {
  913.             LoadString( g_hInst,
  914.                         sIconRegKeys[iX].iDefaultTitleResource,
  915.                         szTemp,
  916.                         MAX_PATH
  917.                        );
  918.         }
  919.         lvI.iItem = iX;
  920.         lvI.iSubItem = 0;
  921.         lvI.pszText = szTemp;
  922.         lvI.iImage = iX;
  923.         if( ListView_InsertItem( hWndList, &lvI ) == -1 )
  924.             return NULL;
  925.     }
  926. #ifdef JIGGLE_FIX
  927.     // To fix long standing listview bug, we need to "jiggle" the listview
  928.     // window size so that it will do a recompute and realize that we need a
  929.     // scroll bar...
  930.     GetWindowRect( hWndList, &rc );
  931.     MapWindowPoints( NULL, hWndParent, (LPPOINT)&rc, 2 );
  932.     MoveWindow( hWndList, rc.left, rc.top, rc.right - rc.left+1, rc.bottom - rc.top, FALSE );
  933.     MoveWindow( hWndList, rc.left, rc.top, rc.right - rc.left,   rc.bottom - rc.top, FALSE );
  934. #endif
  935.     // Set First item to selected
  936.     ListView_SetItemState (hWndList, 0, LVIS_SELECTED, LVIS_SELECTED);
  937.     // Get Selected item
  938.     for(int iIndex = 0;iIndex < NUM_ICONS;iIndex++ )
  939.     {
  940.         if( ListView_GetItemState( hWndList, iIndex, LVIS_SELECTED ) )
  941.         {
  942.             bEnable = TRUE;
  943.             break;
  944.         }
  945.     }
  946.     EnableWindow( GetDlgItem( hWndParent, IDC_CHANGEICON ), bEnable );
  947.     EnableWindow( GetDlgItem( hWndParent, IDC_ICONDEFAULT ), bEnable );
  948.     return (hWndList);
  949. }
  950. int GetIconState (void)
  951. {
  952.     BOOL bRet;
  953.     int iSize;
  954.     bRet = GetRegValueInt (HKEY_CURRENT_USER, c_szHICKey, c_szWMSISVal, &iSize);
  955.     if (bRet == FALSE)
  956.         return ICON_DEFAULT;
  957.     if (iSize == ICON_DEFAULT_NORMAL)
  958.         return ICON_DEFAULT;
  959.     else if (iSize == ICON_DEFAULT_LARGE)
  960.         return ICON_LARGE;
  961.     return ICON_INDETERMINATE;
  962. }
  963. BOOL ChangeIconSizes (HWND hDlg, int iOldState, int iNewState)
  964. {
  965.     BOOL bRet;
  966.     int  iOldSize, iNewSize;
  967.     int  iHorz;
  968.     int  iVert;
  969.     // Don't bother if nothing changed
  970.     if (iOldState == iNewState)
  971.         return FALSE;
  972.     // Get New Size
  973.     switch (iNewState)
  974.         {
  975.         case ICON_DEFAULT:
  976.             iNewSize = ICON_DEFAULT_NORMAL;
  977.             break;
  978.         case ICON_LARGE:
  979.             iNewSize = ICON_DEFAULT_LARGE;
  980.             break;
  981.         case ICON_INDETERMINATE:
  982.             // Don't bother to change anything
  983.             return FALSE;
  984.         default:
  985.             return FALSE;
  986.         }
  987.     // Get Original Size
  988.     bRet = GetRegValueInt (HKEY_CURRENT_USER, c_szHICKey, c_szWMSISVal, &iOldSize);
  989.     if (!bRet)
  990.     {
  991.         // Try geting system default instead
  992.         iOldSize = GetSystemMetrics (SM_CXICON);
  993.     }
  994.     // Don't need to change size if nothing has really changed
  995.     if (iNewSize == iOldSize)
  996.         return FALSE;
  997.     // Get new horizontal spacing
  998.     iHorz = GetSystemMetrics (SM_CXICONSPACING);
  999.     iHorz -= iOldSize;
  1000.     if (iHorz < 0)
  1001.     {
  1002.         iHorz = 0;
  1003.     }
  1004.     iHorz += iNewSize;
  1005.     // Get new vertical spacing
  1006.     iVert = GetSystemMetrics (SM_CYICONSPACING);
  1007.     iVert -= iOldSize;
  1008.     if (iVert < 0)
  1009.     {
  1010.         iVert = 0;
  1011.     }
  1012.     iVert += iNewSize;
  1013.         // Set New sizes and spacing
  1014.     bRet = SetRegValueInt( HKEY_CURRENT_USER, c_szHICKey, c_szWMSISVal, iNewSize );
  1015.     if (!bRet)
  1016.         return FALSE;
  1017.     SystemParametersInfo( SPI_ICONHORIZONTALSPACING, iHorz, NULL, SPIF_UPDATEINIFILE );
  1018.     SystemParametersInfo( SPI_ICONVERTICALSPACING, iVert, NULL, SPIF_UPDATEINIFILE );
  1019.         // Turn from Tri-State back to normal check box
  1020.     if (iOldState == ICON_INDETERMINATE)
  1021.     {
  1022.         HWND hItem = GetDlgItem (hDlg, IDC_LARGEICONS);
  1023.         SendMessage( hItem,
  1024.                      BM_SETSTYLE,
  1025.                      (WPARAM)LOWORD(BS_AUTOCHECKBOX),
  1026.                      MAKELPARAM( FALSE,0)
  1027.                     );
  1028.     }
  1029.     // We did change the sizes
  1030.     return TRUE;
  1031. }
  1032. //
  1033. //  ExtractPlusColorIcon
  1034. //
  1035. //  Extract Icon from a file in proper Hi or Lo color for current system display
  1036. //
  1037. // from FrancisH on 6/22/95 with mods by TimBragg
  1038. HRESULT ExtractPlusColorIcon( LPCTSTR szPath, int nIndex, HICON *phIcon,
  1039.                               UINT uSizeLarge, UINT uSizeSmall)
  1040. {
  1041.     IShellLink *psl;
  1042.     HRESULT hres;
  1043.     HICON hIcons[2];    // MUST! - provide for TWO return icons
  1044.     if ( !gfCoInitDone )
  1045.     {
  1046.         if (SUCCEEDED(CoInitialize(NULL)))
  1047.             gfCoInitDone = TRUE;
  1048.     }
  1049.     *phIcon = NULL;
  1050.     if (SUCCEEDED(hres = CoCreateInstance(CLSID_ShellLink, NULL,
  1051.         CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&psl)))
  1052.     {
  1053.         if (SUCCEEDED(hres = psl->SetIconLocation(szPath, nIndex)))
  1054.         {
  1055.             IExtractIcon *pei;
  1056.             if (SUCCEEDED(hres = psl->QueryInterface(IID_IExtractIcon, (void**)&pei)))
  1057.             {
  1058.                 if (SUCCEEDED(hres = pei->Extract(szPath, nIndex,
  1059.                     &hIcons[0], &hIcons[1], (UINT)MAKEWPARAM((WORD)uSizeLarge,
  1060.                     (WORD)uSizeSmall))))
  1061.                 {
  1062.                     *phIcon = hIcons[0];    // Return first icon to caller
  1063.                 }
  1064.                 pei->Release();
  1065.             }
  1066.         }
  1067.         psl->Release();
  1068.     }
  1069.     return hres;
  1070. }   // end ExtractPlusColorIcon()
  1071. //
  1072. //  GetAnimations
  1073. //
  1074. //  Get current state of animations (windows / menus / etc.).
  1075. //
  1076. WPARAM GetAnimations(DWORD *pdwEffect)
  1077. {
  1078.     BOOL fMenu = FALSE, fWindow = FALSE, fCombo = FALSE, fSmooth = FALSE, fList = FALSE, fFade = FALSE;
  1079.     ANIMATIONINFO ai;
  1080.     ai.cbSize = sizeof(ai);
  1081.     if (SystemParametersInfo( SPI_GETANIMATION, sizeof(ai), (PVOID)&ai, 0 ))
  1082.     {
  1083.         fWindow = (ai.iMinAnimate) ? TRUE : FALSE;
  1084.     }
  1085.     SystemParametersInfo( SPI_GETCOMBOBOXANIMATION, 0, (PVOID)&fCombo, 0 );
  1086.     SystemParametersInfo( SPI_GETLISTBOXSMOOTHSCROLLING, 0, (PVOID)&fList, 0 );
  1087.     SystemParametersInfo( SPI_GETMENUANIMATION, 0, (PVOID)&fMenu, 0 );
  1088.     fSmooth = (BOOL)GetRegValueDword( HKEY_CURRENT_USER,
  1089.                                       (LPTSTR)c_szSSKey,
  1090.                                       (LPTSTR)c_szSSVal
  1091.                                      );
  1092.     if (fSmooth == REG_BAD_DWORD)
  1093.     {
  1094.         fSmooth = 1;
  1095.     }
  1096.     
  1097.     SystemParametersInfo( SPI_GETMENUFADE, 0, (PVOID)&fFade, 0 );
  1098.     *pdwEffect = (fFade ? MENU_EFFECT_FADE : MENU_EFFECT_SCROLL);
  1099.     
  1100.     if (fMenu && fWindow && fCombo && fSmooth && fList)
  1101.         return BST_CHECKED;
  1102.     if ((!fMenu) && (!fWindow) && (!fCombo) && (!fSmooth) && (!fList))
  1103.         return BST_UNCHECKED;
  1104.     return BST_INDETERMINATE;
  1105. }
  1106. //
  1107. //  SetAnimations
  1108. //
  1109. //  Set animations according (windows / menus / etc.) according to flag.
  1110. //
  1111. void SetAnimations(WPARAM wVal, DWORD dwEffect)
  1112. {
  1113.     ANIMATIONINFO ai;
  1114.     if (wVal != BST_INDETERMINATE)
  1115.     {
  1116.         BOOL bVal = (wVal == BST_CHECKED) ? 1 : 0;
  1117.         BOOL bEfx = (dwEffect == MENU_EFFECT_FADE) ? 1 : 0;
  1118.             
  1119.         ai.cbSize = sizeof(ai);
  1120.         ai.iMinAnimate = bVal;
  1121.         SystemParametersInfo( SPI_SETANIMATION, sizeof(ai), (PVOID)&ai, SPIF_UPDATEINIFILE );
  1122.         SystemParametersInfo( SPI_SETCOMBOBOXANIMATION, 0, (PVOID)bVal, SPIF_UPDATEINIFILE );
  1123.         SystemParametersInfo( SPI_SETLISTBOXSMOOTHSCROLLING, 0, (PVOID)bVal, SPIF_UPDATEINIFILE );
  1124.         SystemParametersInfo( SPI_SETMENUANIMATION, 0, (PVOID)bVal, SPIF_UPDATEINIFILE );
  1125.         SystemParametersInfo( SPI_SETTOOLTIPANIMATION, 0, (PVOID)bVal, SPIF_UPDATEINIFILE );
  1126.         SetRegValueDword( HKEY_CURRENT_USER,
  1127.                           (LPTSTR)c_szSSKey,
  1128.                           (LPTSTR)c_szSSVal,
  1129.                           bVal
  1130.                         );
  1131.         SystemParametersInfo( SPI_SETMENUFADE, 0, (PVOID)bEfx, SPIF_UPDATEINIFILE);
  1132.         SystemParametersInfo( SPI_SETTOOLTIPFADE, 0, (PVOID)bEfx, SPIF_UPDATEINIFILE);
  1133.         SystemParametersInfo( SPI_SETSELECTIONFADE, 0, bVal ? (PVOID)bEfx : (PVOID)0, SPIF_UPDATEINIFILE);
  1134.     }
  1135. }