windows-nt/Source/XPSP1/NT/shell/cpls/system/visualfx.cpp
2020-09-26 16:20:57 +08:00

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;
}