272 lines
7.2 KiB
C++
272 lines
7.2 KiB
C++
|
#include "sysdm.h"
|
||
|
#include <windowsx.h>
|
||
|
#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;
|
||
|
}
|