#include "sysdm.h" #include #include "shlapip.h" #include "regstr.h" #include "ccstock.h" #include "shguidp.h" #include "ieguidp.h" #include "help.h" #define REGSTRA_EXPLORER_VISUALFX "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VisualEffects" #define REGSTRA_VISUALFX_SETTING "VisualFXSetting" #define VISUALFX_SETTING_AUTO 0x0 #define VISUALFX_SETTING_LOOKS 0x1 #define VISUALFX_SETTING_PERF 0x2 #define VISUALFX_SETTING_CUSTOM 0x3 DWORD aVisualFXHelpIds[] = { IDC_VFX_TITLE, NO_HELP, IDC_VFX_TREE, NO_HELP, IDC_VFX_BESTLOOKS, (IDH_PERF + 10), IDC_VFX_BESTPERF, (IDH_PERF + 11), IDC_VFX_AUTO, (IDH_PERF + 12), IDC_VFX_CUSTOM, (IDH_PERF + 19), 0, 0 }; class CVisualEffectsDlg { public: INT_PTR DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); HRESULT Init(); CVisualEffectsDlg(); virtual ~CVisualEffectsDlg(); private: void _EnableApply(); void _SetItemCheckState(HTREEITEM hti, BOOL fCheck); void _OnCommand(WORD wID); void _OnInitDialog(HWND hDlg); void _OnNotify(LPNMHDR pnm); WORD _wMode; HWND _hwndTree; HWND _hDlg; IRegTreeOptions *_prto; BOOL _fDirtyTree; BOOL _fTreeInit; }; CVisualEffectsDlg::CVisualEffectsDlg() : _hwndTree(NULL), _hDlg(NULL), _prto(NULL), _fDirtyTree(FALSE), _fTreeInit(FALSE), _wMode(VISUALFX_SETTING_AUTO) { } CVisualEffectsDlg::~CVisualEffectsDlg() { ATOMICRELEASE(_prto); } HRESULT CVisualEffectsDlg::Init() { return CoCreateInstance(CLSID_CRegTreeOptions, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IRegTreeOptions, &_prto)); } void CVisualEffectsDlg::_EnableApply() { if( !_fTreeInit ) { // Enable the "Apply" button because changes have happened. _fDirtyTree = TRUE; SendMessage(GetParent(_hDlg), PSM_CHANGED, (WPARAM)_hDlg, 0L); } } void CVisualEffectsDlg::_SetItemCheckState(HTREEITEM hti, BOOL fCheck) { TVITEM tvi; tvi.hItem = hti; tvi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (TreeView_GetItem(_hwndTree, &tvi)) { tvi.iImage = fCheck ? IDCHECKED : IDUNCHECKED; tvi.iSelectedImage = tvi.iImage; TreeView_SetItem(_hwndTree, &tvi); } } void CVisualEffectsDlg::_OnCommand(WORD wID) { if (wID != _wMode) { _wMode = wID; switch (wID) { case IDC_VFX_BESTLOOKS: case IDC_VFX_BESTPERF: { BOOL fCheck = (wID == IDC_VFX_BESTLOOKS); for (HTREEITEM hti = TreeView_GetRoot(_hwndTree); hti != NULL; hti = TreeView_GetNextItem(_hwndTree, hti, TVGN_NEXT)) { _SetItemCheckState(hti, fCheck); } } _EnableApply(); break; case IDC_VFX_AUTO: _prto->WalkTree(WALK_TREE_RESTORE); _EnableApply(); break; case IDC_VFX_CUSTOM: break; } } } void CVisualEffectsDlg::_OnInitDialog(HWND hDlg) { _hDlg = hDlg; _hwndTree = GetDlgItem(hDlg, IDC_VFX_TREE); DWORD cbData, dwData; cbData = sizeof(dwData); if (ERROR_SUCCESS != SHRegGetUSValue(TEXT(REGSTRA_EXPLORER_VISUALFX), TEXT(REGSTRA_VISUALFX_SETTING), NULL, &dwData, &cbData, FALSE, NULL, 0)) { dwData = VISUALFX_SETTING_AUTO; } _fTreeInit = TRUE; _prto->InitTree(_hwndTree, HKEY_LOCAL_MACHINE, REGSTRA_EXPLORER_VISUALFX, NULL); SendMessage(GetDlgItem(_hDlg, IDC_VFX_AUTO + dwData), BM_CLICK, 0, 0); _fTreeInit = FALSE; } void CVisualEffectsDlg::_OnNotify(LPNMHDR pnm) { switch (pnm->code) { case NM_CLICK: case NM_DBLCLK: if (pnm->idFrom == IDC_VFX_TREE) { TV_HITTESTINFO ht; DWORD dwPos = GetMessagePos(); // get where we were hit ht.pt.x = GET_X_LPARAM(dwPos); ht.pt.y = GET_Y_LPARAM(dwPos); ScreenToClient(_hwndTree, &ht.pt); // translate it to our window // retrieve the item hit HTREEITEM hti = TreeView_HitTest(_hwndTree, &ht); if (hti) { if (VISUALFX_SETTING_CUSTOM != _wMode) { CheckRadioButton(_hDlg, IDC_VFX_AUTO, IDC_VFX_CUSTOM, IDC_VFX_CUSTOM); } _prto->ToggleItem(hti); _EnableApply(); } } break; case TVN_KEYDOWN: if (((LPNMTVKEYDOWN)pnm)->wVKey == VK_SPACE) { if (VISUALFX_SETTING_CUSTOM != _wMode) { CheckRadioButton(_hDlg, IDC_VFX_AUTO, IDC_VFX_CUSTOM, IDC_VFX_CUSTOM); } _prto->ToggleItem((HTREEITEM)SendMessage(_hwndTree, TVM_GETNEXTITEM, (WPARAM)TVGN_CARET, 0L)); _EnableApply(); } break; case PSN_APPLY: if (_fDirtyTree) { _prto->WalkTree(WALK_TREE_SAVE); for (int i = IDC_VFX_AUTO; i <= IDC_VFX_CUSTOM; i++) { if (BST_CHECKED == SendMessage(GetDlgItem(_hDlg, i), BM_GETCHECK, 0, 0)) { DWORD dwData = VISUALFX_SETTING_AUTO + (i - IDC_VFX_AUTO); SHRegSetUSValue(TEXT(REGSTRA_EXPLORER_VISUALFX), TEXT(REGSTRA_VISUALFX_SETTING), REG_DWORD, &dwData, sizeof(dwData), SHREGSET_FORCE_HKCU); break; } } DWORD_PTR dwResult = 0; SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, NULL, (LPARAM)TEXT("VisualEffects"), SMTO_NOTIMEOUTIFNOTHUNG, 1000, &dwResult); _fDirtyTree = FALSE; } break; } } INT_PTR CVisualEffectsDlg::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: _OnInitDialog(hDlg); break; case WM_NOTIFY: _OnNotify(((LPNMHDR)lParam)); break; case WM_COMMAND: _OnCommand(GET_WM_COMMAND_ID(wParam, lParam)); break; case WM_DESTROY: _prto->WalkTree(WALK_TREE_DELETE); break; case WM_HELP: // F1 WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP, (DWORD_PTR) (LPSTR) aVisualFXHelpIds); break; case WM_CONTEXTMENU: // right mouse click WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU, (DWORD_PTR) (LPSTR) aVisualFXHelpIds); break; default: return FALSE; } return TRUE; } INT_PTR WINAPI VisualEffectsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR fRet = FALSE; CVisualEffectsDlg* pve; if (uMsg == WM_INITDIALOG) { pve = new CVisualEffectsDlg(); if (pve && FAILED(pve->Init())) { delete pve; pve = NULL; } SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pve); } else { pve = (CVisualEffectsDlg*)GetWindowLongPtr(hDlg, DWLP_USER); } if (pve) { fRet = pve->DlgProc(hDlg, uMsg, wParam, lParam); if (uMsg == WM_DESTROY) { delete pve; SetWindowLongPtr(hDlg, DWLP_USER, NULL); } } return fRet; }