926 lines
26 KiB
C++
926 lines
26 KiB
C++
|
/*****************************************************************************\
|
||
|
FILE: config.cpp
|
||
|
|
||
|
DESCRIPTION:
|
||
|
The class will handle the user's configuration state. It will also
|
||
|
display the Screen Saver's configuration dialog to allow the user to change
|
||
|
these settings.
|
||
|
|
||
|
BryanSt 12/18/2000
|
||
|
Copyright (C) Microsoft Corp 2000-2001. All rights reserved.
|
||
|
\*****************************************************************************/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#include <shlobj.h>
|
||
|
#include "config.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
|
||
|
#define SZ_REGKEY_THISSCREENSAVER TEXT("Software\\Microsoft\\Screensavers\\Museum")
|
||
|
#define SZ_REGKEY_THISSS_CONFIG SZ_REGKEY_THISSCREENSAVER TEXT("\\Config")
|
||
|
|
||
|
#define SZ_REGVALUE_QUALITYSLIDER TEXT("Quality Slider")
|
||
|
#define SZ_REGVALUE_SPEEDSLIDER TEXT("Speed Slider")
|
||
|
#define SZ_REGVALUE_TEMPMB TEXT("Temp Disk Space")
|
||
|
#define SZ_REGVALUE_WALKSPEED TEXT("Walk Speed")
|
||
|
#define SZ_REGVALUE_OTHERPICTURES TEXT("Other Pictures Directory")
|
||
|
#define SZ_REGVALUE_VIEWTIME TEXT("View Painting Time")
|
||
|
|
||
|
SPEED_SETTING s_SpeedSettings[MAX_SPEED] =
|
||
|
{
|
||
|
{15.0f, 15.0f, 60.0f, 15, 15, 50, 50},
|
||
|
{11.0f, 11.0f, 25.0f, 12, 12, 35, 35},
|
||
|
{10.0f, 10.0f, 15.0f, 10, 10, 35, 35},
|
||
|
{7.0f, 7.0f, 12.0f, 9, 9, 25, 25},
|
||
|
{4.0f, 4.0f, 10.0f, 8, 8, 25, 25},
|
||
|
{4.0f, 4.0f, 7.0f, 7, 7, 25, 25},
|
||
|
{2.5f, 2.5f, 5.0f, 6, 6, 21, 21},
|
||
|
{2.0f, 2.0f, 2.50f, 5, 5, 17, 17},
|
||
|
{2.00f, 2.0f, 1.5f, 10, 10, 15, 15},
|
||
|
{0.50f, 0.5f, 0.5f, 7, 7, 15, 15},
|
||
|
{0.50f, 0.5f, 0.5f, 5, 5, 15, 15},
|
||
|
// {5.00f, 10.0f, 0.50f, 5, 5, 15, 15},
|
||
|
};
|
||
|
|
||
|
|
||
|
static QUALITY_SETTING s_QualitySettings[NUM_BOOL_SETTINGS] =
|
||
|
{
|
||
|
{TEXT("Show Stats")}, // IDC_CHECK_SHOWSTATS
|
||
|
};
|
||
|
|
||
|
|
||
|
// Values we can add: Lighing, Vectors on floor, etc.
|
||
|
static BOOL s_fQualityValues[MAX_QUALITY][NUM_BOOL_SETTINGS] =
|
||
|
{ // ORDER: AntiAlias, Texture Perspective, Texture Dithering, Depth Buffering (Z), Specular Highlights, Anti-Alias Edges, Render Quality (Flat, Gouraud, Phong)
|
||
|
{0},
|
||
|
{0},
|
||
|
{0},
|
||
|
{0},
|
||
|
{0},
|
||
|
{0},
|
||
|
{0},
|
||
|
{0}
|
||
|
};
|
||
|
|
||
|
#define MINUTE 60
|
||
|
|
||
|
static int s_nViewTimeSettings[MAX_VIEWTIME] =
|
||
|
{ 1, 2, 3, 4, 5, 7, 10, 12, 15, 17,
|
||
|
20, 25, 30, 35, 40, 45, 50, 55, MINUTE, MINUTE + 15,
|
||
|
MINUTE + 30, MINUTE + 45, 2 * MINUTE, 2 * MINUTE + 30, 3 * MINUTE, 4 * MINUTE, 5 * MINUTE, 7 * MINUTE, 10 * MINUTE, 20 * MINUTE};
|
||
|
|
||
|
static DWORD s_RenderQualitySliderValues[MAX_QUALITY] =
|
||
|
{
|
||
|
0, 1, 1, 1, 2, 2, 2, 2
|
||
|
};
|
||
|
|
||
|
|
||
|
static LPCTSTR s_pszDWORDSettingsArray[NUM_DWORD_SETTINGS] =
|
||
|
{
|
||
|
TEXT("RenderQuality"), // IDC_RENDERQUALITY1
|
||
|
TEXT("RealTimeMode"), // Walking Speed
|
||
|
TEXT("Quality Slider"),
|
||
|
TEXT("Speed Slider"),
|
||
|
TEXT("View Time Slider"),
|
||
|
};
|
||
|
|
||
|
static FOLDER_SETTING s_FolderSettings[NUM_BOOL_FOLDERS] =
|
||
|
{
|
||
|
{TEXT("My Pictures"), TRUE}, // IDC_CHECK_MYPICTS
|
||
|
{TEXT("Common Pictures"), FALSE}, // IDC_CHECK_COMMONPICTS
|
||
|
{TEXT("Windows Pictures"), TRUE}, // IDC_CHECK_WINPICTS
|
||
|
{TEXT("Other Pictures"), FALSE}, // IDC_CHECK_OTHERPICTS
|
||
|
};
|
||
|
|
||
|
static DWORD s_dwSettingsDefaults[NUM_DWORD_SETTINGS] =
|
||
|
{
|
||
|
DEFAULT_RENDERQUALITY, // CONFIG_DWORD_RENDERQUALITY
|
||
|
2, // CONFIG_DWORD_REALTIMEMODE
|
||
|
DEFAULT_QUALITYSLIDER, // CONFIG_DWORD_QUALITY_SLIDER
|
||
|
DEFAULT_SPEEDSLIDER, // CONFIG_DWORD_SPEED_SLIDER
|
||
|
DEFAULT_VIEWTIMESLIDER, // CONFIG_DWORD_VIEWPAINTINGTIME
|
||
|
};
|
||
|
|
||
|
CConfig * g_pConfig = NULL; // The configuration settings the user wants to use.
|
||
|
|
||
|
|
||
|
|
||
|
CConfig::CConfig(CMSLogoDXScreenSaver * pMain)
|
||
|
{
|
||
|
m_hkeyCurrentUser = NULL;
|
||
|
m_fLoaded = FALSE;
|
||
|
m_hDlg = NULL;
|
||
|
m_szOther[0] = 0;
|
||
|
|
||
|
m_pMain = pMain;
|
||
|
|
||
|
for (int nIndex = 0; nIndex < ARRAYSIZE(m_pszCustomPaths); nIndex++)
|
||
|
{
|
||
|
m_pszCustomPaths[nIndex] = NULL;
|
||
|
m_dwCustomScale[nIndex] = 100; // Default to 100%
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
CConfig::~CConfig()
|
||
|
{
|
||
|
if (m_hkeyCurrentUser)
|
||
|
{
|
||
|
RegCloseKey(m_hkeyCurrentUser);
|
||
|
m_hkeyCurrentUser = NULL;
|
||
|
}
|
||
|
|
||
|
for (int nIndex = 0; nIndex < ARRAYSIZE(m_pszCustomPaths); nIndex++)
|
||
|
{
|
||
|
Str_SetPtr(&(m_pszCustomPaths[nIndex]), NULL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_GetStateFromUI(void)
|
||
|
{
|
||
|
int nIndex;
|
||
|
|
||
|
// Get Directory Checkboxes
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fFolders); nIndex++)
|
||
|
{
|
||
|
m_fFolders[nIndex] = GetCheckBox(m_hDlg, IDC_CHECK_MYPICTS + nIndex);
|
||
|
}
|
||
|
|
||
|
// Set Other Path
|
||
|
GetWindowText(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_szOther, ARRAYSIZE(m_szOther));
|
||
|
|
||
|
// Get Sliders
|
||
|
m_dwSettings[CONFIG_DWORD_SPEED_SLIDER] = (DWORD) TaskBar_GetPos(GetDlgItem(m_hDlg, IDC_SLIDER_SPEED));
|
||
|
m_dwSettings[CONFIG_DWORD_QUALITY_SLIDER] = (DWORD) TaskBar_GetPos(GetDlgItem(m_hDlg, IDC_SLIDER_QUALITY));
|
||
|
m_dwSettings[CONFIG_DWORD_VIEWPAINTINGTIME] = s_nViewTimeSettings[(DWORD) TaskBar_GetPos(GetDlgItem(m_hDlg, IDC_SLIDER_VIEWTIME))];
|
||
|
|
||
|
// Get Walk Speed ComboBox
|
||
|
m_dwSettings[CONFIG_DWORD_REALTIMEMODE] = 0;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_LoadQualitySliderValues(void)
|
||
|
{
|
||
|
int nNewPos = TaskBar_GetPos(GetDlgItem(m_hDlg, IDC_SLIDER_QUALITY));
|
||
|
|
||
|
if ((nNewPos < 0) || (nNewPos >= MAX_QUALITY))
|
||
|
{
|
||
|
nNewPos = DEFAULT_QUALITYSLIDER; // The value was invalid so revert to a valid value.
|
||
|
}
|
||
|
|
||
|
for (int nIndex = 0; nIndex < ARRAYSIZE(m_fSettings); nIndex++)
|
||
|
{
|
||
|
m_fSettings[nIndex] = s_fQualityValues[nNewPos][nIndex];
|
||
|
}
|
||
|
|
||
|
m_dwSettings[CONFIG_DWORD_RENDERQUALITY] = s_RenderQualitySliderValues[nNewPos];
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_UpdateViewTimeSelection(void)
|
||
|
{
|
||
|
int nNewPos = TaskBar_GetPos(GetDlgItem(m_hDlg, IDC_SLIDER_VIEWTIME));
|
||
|
TCHAR szDesc[MAX_PATH];
|
||
|
|
||
|
if ((nNewPos < 0) || (nNewPos >= MAX_VIEWTIME))
|
||
|
{
|
||
|
nNewPos = DEFAULT_VIEWTIMESLIDER; // The value was invalid so revert to a valid value.
|
||
|
}
|
||
|
|
||
|
LoadString(HINST_THISDLL, IDS_VIEW_TIME_DESC + nNewPos, szDesc, ARRAYSIZE(szDesc));
|
||
|
SetWindowText(GetDlgItem(m_hDlg, IDC_STATIC_VIEWTIME), szDesc);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
int CALLBACK BrowseCallback(HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData)
|
||
|
{
|
||
|
int nResult = 0;
|
||
|
|
||
|
switch (msg)
|
||
|
{
|
||
|
case BFFM_INITIALIZED:
|
||
|
if (lpData) // Documentation says it will be NULL but other code does this.
|
||
|
{
|
||
|
// we passed ppidl as lpData so pass on just pidl
|
||
|
// Notice I pass BFFM_SETSELECTIONA which would normally indicate ANSI.
|
||
|
// I do this because Win95 requires it, but it doesn't matter because I'm
|
||
|
// only passing a pidl
|
||
|
SendMessage(hwnd, BFFM_SETSELECTIONA, FALSE, (LPARAM)((LPITEMIDLIST)lpData));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return nResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnBrowseForFolder(void)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
LPITEMIDLIST pidlCurrent = NULL;
|
||
|
BROWSEINFO bi = {0};
|
||
|
TCHAR szTitle[MAX_PATH];
|
||
|
|
||
|
GetWindowText(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_szOther, ARRAYSIZE(m_szOther));
|
||
|
LoadString(HINST_THISDLL, IDS_OTHERBROWSE_TITLE, szTitle, ARRAYSIZE(szTitle));
|
||
|
|
||
|
hr = ShellFolderParsePath(m_szOther, &pidlCurrent);
|
||
|
bi.hwndOwner = m_hDlg;
|
||
|
bi.lpszTitle = szTitle;
|
||
|
bi.lpfn = BrowseCallback;
|
||
|
bi.lParam = (LPARAM) pidlCurrent;
|
||
|
bi.ulFlags = (BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS | BIF_EDITBOX | BIF_USENEWUI | BIF_VALIDATE);
|
||
|
|
||
|
LPITEMIDLIST pidlNew = SHBrowseForFolder(&bi);
|
||
|
if (pidlNew)
|
||
|
{
|
||
|
hr = ShellFolderGetPath(pidlNew, m_szOther, ARRAYSIZE(m_szOther));
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
SetWindowText(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_szOther);
|
||
|
}
|
||
|
|
||
|
ILFree(pidlNew);
|
||
|
}
|
||
|
|
||
|
ILFree(pidlCurrent);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnInitDlg(HWND hDlg)
|
||
|
{
|
||
|
m_hDlg = hDlg;
|
||
|
int nIndex;
|
||
|
|
||
|
// Set Directory Checkboxes
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fFolders); nIndex++)
|
||
|
{
|
||
|
SetCheckBox(m_hDlg, IDC_CHECK_MYPICTS + nIndex, m_fFolders[nIndex]);
|
||
|
}
|
||
|
|
||
|
// Set Other Path
|
||
|
SetWindowText(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_szOther);
|
||
|
EnableWindow(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_fFolders[3]);
|
||
|
EnableWindow(GetDlgItem(m_hDlg, IDC_BUTTON_BROWSEPICTS), m_fFolders[3]);
|
||
|
|
||
|
// If we want to run on IE4, we need to delay load this.
|
||
|
SHAutoComplete(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), SHACF_FILESYSTEM);
|
||
|
|
||
|
// Set Sliders
|
||
|
TaskBar_SetRange(GetDlgItem(m_hDlg, IDC_SLIDER_SPEED), TRUE, 0, MAX_SPEED-1);
|
||
|
TaskBar_SetPos(GetDlgItem(m_hDlg, IDC_SLIDER_SPEED), TRUE, m_dwSettings[CONFIG_DWORD_SPEED_SLIDER]);
|
||
|
|
||
|
TaskBar_SetRange(GetDlgItem(m_hDlg, IDC_SLIDER_QUALITY), TRUE, 0, MAX_QUALITY-1);
|
||
|
TaskBar_SetPos(GetDlgItem(m_hDlg, IDC_SLIDER_QUALITY), TRUE, m_dwSettings[CONFIG_DWORD_QUALITY_SLIDER]);
|
||
|
|
||
|
TaskBar_SetRange(GetDlgItem(m_hDlg, IDC_SLIDER_VIEWTIME), TRUE, 0, MAX_VIEWTIME-1);
|
||
|
TaskBar_SetPos(GetDlgItem(m_hDlg, IDC_SLIDER_VIEWTIME), TRUE, m_dwSettings[CONFIG_DWORD_VIEWPAINTINGTIME]);
|
||
|
|
||
|
_UpdateViewTimeSelection();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnDestroy(HWND hDlg)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CConfig::_IsDialogDataValid(void)
|
||
|
{
|
||
|
BOOL fValid = TRUE;
|
||
|
|
||
|
GetWindowText(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_szOther, ARRAYSIZE(m_szOther));
|
||
|
if (m_fFolders[CONFIG_FOLDER_OTHER])
|
||
|
{
|
||
|
if (!PathFileExists(m_szOther))
|
||
|
{
|
||
|
TCHAR szMessage[MAX_PATH];
|
||
|
TCHAR szTitle[MAX_PATH];
|
||
|
|
||
|
LoadString(HINST_THISDLL, IDS_ERROR_INVALIDOTHERPATH, szMessage, ARRAYSIZE(szMessage));
|
||
|
LoadString(HINST_THISDLL, IDS_ERROR_TITLE_OTHERPATH, szTitle, ARRAYSIZE(szTitle));
|
||
|
MessageBox(m_hDlg, szMessage, szTitle, MB_OK);
|
||
|
fValid = FALSE;
|
||
|
}
|
||
|
else if (!PathIsDirectory(m_szOther))
|
||
|
{
|
||
|
TCHAR szMessage[MAX_PATH];
|
||
|
TCHAR szTitle[MAX_PATH];
|
||
|
|
||
|
LoadString(HINST_THISDLL, IDS_ERROR_OTHERPATH_NOTDIR, szMessage, ARRAYSIZE(szMessage));
|
||
|
LoadString(HINST_THISDLL, IDS_ERROR_TITLE_OTHERPATH, szTitle, ARRAYSIZE(szTitle));
|
||
|
MessageBox(m_hDlg, szMessage, szTitle, MB_OK);
|
||
|
fValid = FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return fValid;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
BOOL fHandled = 1; // Not handled (WM_COMMAND seems to be different)
|
||
|
WORD idCtrl = GET_WM_COMMAND_ID(wParam, lParam);
|
||
|
WORD wEvent = GET_WM_COMMAND_CMD(wParam, lParam);
|
||
|
|
||
|
switch (idCtrl)
|
||
|
{
|
||
|
case IDOK:
|
||
|
if (_IsDialogDataValid())
|
||
|
{
|
||
|
_GetStateFromUI();
|
||
|
EndDialog(hDlg, IDOK);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hDlg, IDCANCEL);
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_OTHERPICTS:
|
||
|
if ((BN_CLICKED == wEvent) && (IDC_CHECK_OTHERPICTS == idCtrl))
|
||
|
{
|
||
|
m_fFolders[3] = GetCheckBox(m_hDlg, IDC_CHECK_OTHERPICTS);
|
||
|
|
||
|
EnableWindow(GetDlgItem(m_hDlg, IDC_EDIT_OTHERPICTS), m_fFolders[3]);
|
||
|
EnableWindow(GetDlgItem(m_hDlg, IDC_BUTTON_BROWSEPICTS), m_fFolders[3]);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
case IDC_BUTTON_ADVANCEDQUALITY:
|
||
|
DisplayAdvancedDialog(m_hDlg);
|
||
|
break;
|
||
|
|
||
|
case IDC_BUTTON_BROWSEPICTS:
|
||
|
_OnBrowseForFolder();
|
||
|
break;
|
||
|
|
||
|
case IDC_BUTTON_MONITORSETTINGS:
|
||
|
if (m_pMain)
|
||
|
{
|
||
|
m_pMain->DisplayMonitorSettings(hDlg);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return fHandled;
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR CALLBACK CConfig::ConfigDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
CConfig * pThis = (CConfig *)GetWindowLongPtr(hDlg, DWLP_USER);
|
||
|
|
||
|
if (WM_INITDIALOG == wMsg)
|
||
|
{
|
||
|
pThis = (CConfig *) lParam;
|
||
|
|
||
|
if (pThis)
|
||
|
{
|
||
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pThis)
|
||
|
{
|
||
|
return pThis->_ConfigDlgProc(hDlg, wMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
return DefWindowProc(hDlg, wMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR CConfig::_ConfigDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch(message)
|
||
|
{
|
||
|
case WM_NOTIFY:
|
||
|
break;
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
_OnInitDlg(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
_OnDestroy(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_HELP:
|
||
|
// TODO: Get help strings
|
||
|
// WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, SZ_HELPFILE_ADVAPPEARANCE, HELP_WM_HELP, (DWORD_PTR) aAdvAppearanceHelpIds);
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU: // right mouse click
|
||
|
// WinHelp((HWND) wParam, SZ_HELPFILE_ADVAPPEARANCE, HELP_CONTEXTMENU, (DWORD_PTR) aAdvAppearanceHelpIds);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
_OnCommand(hDlg, message, wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_HSCROLL:
|
||
|
case WM_VSCROLL:
|
||
|
if (GetDlgItem(m_hDlg, IDC_SLIDER_VIEWTIME) == (HWND) lParam)
|
||
|
{
|
||
|
_UpdateViewTimeSelection();
|
||
|
}
|
||
|
else if (GetDlgItem(m_hDlg, IDC_SLIDER_QUALITY) == (HWND) lParam)
|
||
|
{
|
||
|
_LoadQualitySliderValues();
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_LoadState(void)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if (!m_fLoaded)
|
||
|
{
|
||
|
if (!m_hkeyCurrentUser)
|
||
|
{
|
||
|
hr = HrRegCreateKeyEx(HKEY_CURRENT_USER, SZ_REGKEY_THISSS_CONFIG, 0, NULL, REG_OPTION_NON_VOLATILE, (KEY_WRITE | KEY_READ), NULL, &m_hkeyCurrentUser, NULL);
|
||
|
}
|
||
|
|
||
|
if (m_hkeyCurrentUser)
|
||
|
{
|
||
|
int nIndex;
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fSettings); nIndex++)
|
||
|
{
|
||
|
HrRegGetDWORD(m_hkeyCurrentUser, NULL, s_QualitySettings[nIndex].pszRegValue, (DWORD *)&m_fSettings[nIndex], s_fQualityValues[DEFAULT_QUALITYSLIDER][nIndex]);
|
||
|
}
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_dwSettings); nIndex++)
|
||
|
{
|
||
|
HrRegGetDWORD(m_hkeyCurrentUser, NULL, s_pszDWORDSettingsArray[nIndex], &m_dwSettings[nIndex], s_dwSettingsDefaults[nIndex]);
|
||
|
}
|
||
|
|
||
|
// For the view time, we persist the number of seconds, not the slot number.
|
||
|
// Let's find the slot number from the view time in seconds..
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(s_nViewTimeSettings); nIndex++)
|
||
|
{
|
||
|
if ((DWORD)s_nViewTimeSettings[nIndex] == m_dwSettings[CONFIG_DWORD_VIEWPAINTINGTIME])
|
||
|
{
|
||
|
m_dwSettings[CONFIG_DWORD_VIEWPAINTINGTIME] = nIndex;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fFolders); nIndex++)
|
||
|
{
|
||
|
HrRegGetDWORD(m_hkeyCurrentUser, NULL, s_FolderSettings[nIndex].pszRegValue, (DWORD *)&m_fFolders[nIndex], s_FolderSettings[nIndex].fDefaultToOn); // Only default to on for IDC_CHECK_WINPICTS
|
||
|
}
|
||
|
|
||
|
if (FAILED(HrRegGetValueString(m_hkeyCurrentUser, NULL, SZ_REGVALUE_OTHERPICTURES, m_szOther, ARRAYSIZE(m_szOther))))
|
||
|
{
|
||
|
StrCpyN(m_szOther, TEXT("C:\\"), ARRAYSIZE(m_szOther));
|
||
|
}
|
||
|
|
||
|
// Load any customized textures
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_pszCustomPaths); nIndex++)
|
||
|
{
|
||
|
TCHAR szRegValue[MAX_PATH];
|
||
|
TCHAR szRegString[MAX_PATH];
|
||
|
|
||
|
wnsprintf(szRegValue, ARRAYSIZE(szRegValue), TEXT("Texture #%d"), nIndex);
|
||
|
szRegString[0] = 0; // in case the regkey doesn't exist yet.
|
||
|
|
||
|
HrRegGetValueString(m_hkeyCurrentUser, NULL, szRegValue, szRegString, ARRAYSIZE(szRegString));
|
||
|
if (szRegString[0])
|
||
|
{
|
||
|
Str_SetPtr(&(m_pszCustomPaths[nIndex]), szRegString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Str_SetPtr(&(m_pszCustomPaths[nIndex]), NULL);
|
||
|
}
|
||
|
|
||
|
wnsprintf(szRegValue, ARRAYSIZE(szRegValue), TEXT("Texture #%d Scale"), nIndex);
|
||
|
HrRegGetDWORD(m_hkeyCurrentUser, NULL, szRegValue, (DWORD *)&m_dwCustomScale[nIndex], 100);
|
||
|
}
|
||
|
|
||
|
m_pMain->ReadScreenSettingsPublic( m_hkeyCurrentUser );
|
||
|
}
|
||
|
m_fLoaded = TRUE;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_SaveState(void)
|
||
|
{
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
if (m_hkeyCurrentUser)
|
||
|
{
|
||
|
int nIndex;
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fSettings); nIndex++)
|
||
|
{
|
||
|
HrRegSetDWORD(m_hkeyCurrentUser, NULL, s_QualitySettings[nIndex].pszRegValue, m_fSettings[nIndex]);
|
||
|
}
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_dwSettings); nIndex++)
|
||
|
{
|
||
|
HrRegSetDWORD(m_hkeyCurrentUser, NULL, s_pszDWORDSettingsArray[nIndex], m_dwSettings[nIndex]);
|
||
|
}
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fFolders); nIndex++)
|
||
|
{
|
||
|
HrRegSetDWORD(m_hkeyCurrentUser, NULL, s_FolderSettings[nIndex].pszRegValue, m_fFolders[nIndex]); // Only default to on for IDC_CHECK_WINPICTS
|
||
|
}
|
||
|
|
||
|
hr = HrRegSetValueString(m_hkeyCurrentUser, NULL, SZ_REGVALUE_OTHERPICTURES, m_szOther);
|
||
|
|
||
|
// Load any customized textures
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_pszCustomPaths); nIndex++)
|
||
|
{
|
||
|
TCHAR szRegValue[MAX_PATH];
|
||
|
|
||
|
wnsprintf(szRegValue, ARRAYSIZE(szRegValue), TEXT("Texture #%d"), nIndex);
|
||
|
HrRegSetValueString(m_hkeyCurrentUser, NULL, szRegValue, (m_pszCustomPaths[nIndex] ? m_pszCustomPaths[nIndex] : TEXT("")));
|
||
|
|
||
|
wnsprintf(szRegValue, ARRAYSIZE(szRegValue), TEXT("Texture #%d Scale"), nIndex);
|
||
|
HrRegSetDWORD(m_hkeyCurrentUser, NULL, szRegValue, m_dwCustomScale[nIndex]);
|
||
|
}
|
||
|
|
||
|
m_pMain->WriteScreenSettingsPublic( m_hkeyCurrentUser );
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::GetOtherDir(LPTSTR pszPath, DWORD cchSize)
|
||
|
{
|
||
|
HRESULT hr = _LoadState();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
StrCpyN(pszPath, m_szOther, cchSize);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::GetTexturePath(int nTextureIndex, DWORD * pdwScale, LPTSTR pszPath, DWORD cchSize)
|
||
|
{
|
||
|
HRESULT hr = _LoadState();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
|
||
|
if ((nTextureIndex >= 0) && (nTextureIndex < ARRAYSIZE(m_pszCustomPaths)) &&
|
||
|
m_pszCustomPaths[nTextureIndex] && m_pszCustomPaths[nTextureIndex][0])
|
||
|
{
|
||
|
// We have a custom texture to use.
|
||
|
StrCpyN(pszPath, m_pszCustomPaths[nTextureIndex], cchSize);
|
||
|
*pdwScale = m_dwCustomScale[nTextureIndex];
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CConfig::GetFolderOn(UINT nSetting)
|
||
|
{
|
||
|
HRESULT hr = _LoadState();
|
||
|
BOOL fReturn = FALSE;
|
||
|
|
||
|
if (SUCCEEDED(hr) && (nSetting < ARRAYSIZE(m_fFolders)))
|
||
|
{
|
||
|
fReturn = m_fFolders[nSetting];
|
||
|
}
|
||
|
|
||
|
return fReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CConfig::GetBoolSetting(UINT nSetting)
|
||
|
{
|
||
|
HRESULT hr = _LoadState();
|
||
|
BOOL fReturn = FALSE;
|
||
|
|
||
|
if (SUCCEEDED(hr) && (IDC_CHECK_SHOWSTATS <= nSetting))
|
||
|
{
|
||
|
nSetting -= IDC_CHECK_SHOWSTATS;
|
||
|
if (nSetting < ARRAYSIZE(m_fSettings))
|
||
|
{
|
||
|
fReturn = m_fSettings[nSetting];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return fReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD CConfig::GetDWORDSetting(UINT nSetting)
|
||
|
{
|
||
|
HRESULT hr = _LoadState();
|
||
|
DWORD dwReturn = 0;
|
||
|
|
||
|
if (SUCCEEDED(hr) && (nSetting < ARRAYSIZE(m_dwSettings)))
|
||
|
{
|
||
|
dwReturn = m_dwSettings[nSetting];
|
||
|
}
|
||
|
|
||
|
return dwReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::DisplayConfigDialog(HWND hwndParent)
|
||
|
{
|
||
|
HRESULT hr = _LoadState();
|
||
|
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
// Display Advanced Dialog
|
||
|
if (IDOK == DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(IDD_DIALOG_CONFIG), hwndParent, CConfig::ConfigDlgProc, (LPARAM)this))
|
||
|
{
|
||
|
hr = _SaveState();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(ERROR_CANCELLED);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT CConfig::DisplayAdvancedDialog(HWND hwndParent)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
int nIndex;
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fSettings); nIndex++)
|
||
|
{
|
||
|
m_fAdvSettings[nIndex] = m_fSettings[nIndex];
|
||
|
}
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_dwSettings); nIndex++)
|
||
|
{
|
||
|
m_dwAdvSettings[nIndex] = m_dwSettings[nIndex];
|
||
|
}
|
||
|
|
||
|
// Display Advanced Dialog
|
||
|
if (IDOK == DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(IDD_DIALOG_ADVANCED), hwndParent, CConfig::AdvDlgProc, (LPARAM)this))
|
||
|
{
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fSettings); nIndex++)
|
||
|
{
|
||
|
m_fSettings[nIndex] = m_fAdvSettings[nIndex];
|
||
|
}
|
||
|
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_dwSettings); nIndex++)
|
||
|
{
|
||
|
m_dwSettings[nIndex] = m_dwAdvSettings[nIndex];
|
||
|
}
|
||
|
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(ERROR_CANCELLED);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnEnableCustomTexture(int nIndex, BOOL fEnable)
|
||
|
{
|
||
|
EnableWindow(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOOR + nIndex)), fEnable);
|
||
|
EnableWindow(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOORSIZE + nIndex)), fEnable);
|
||
|
EnableWindow(GetDlgItem(m_hDlgAdvanced, (IDC_STATIC1_TEXTR_FLOOR + nIndex)), fEnable);
|
||
|
EnableWindow(GetDlgItem(m_hDlgAdvanced, (IDC_STATIC2_TEXTR_FLOOR + nIndex)), fEnable);
|
||
|
EnableWindow(GetDlgItem(m_hDlgAdvanced, (IDC_STATIC3_TEXTR_FLOOR + nIndex)), fEnable);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnAdvInitDlg(HWND hDlg)
|
||
|
{
|
||
|
m_hDlgAdvanced = hDlg;
|
||
|
int nIndex;
|
||
|
|
||
|
// Set Directory Checkboxes
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fAdvSettings); nIndex++)
|
||
|
{
|
||
|
SetCheckBox(m_hDlgAdvanced, IDC_CHECK_SHOWSTATS+nIndex, m_fAdvSettings[nIndex]);
|
||
|
}
|
||
|
|
||
|
// Copy the customized textures.
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_pszCustomPaths); nIndex++)
|
||
|
{
|
||
|
TCHAR szPath[MAX_PATH];
|
||
|
|
||
|
SHAutoComplete(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOOR + nIndex)), SHACF_FILESYSTEM);
|
||
|
|
||
|
wnsprintf(szPath, ARRAYSIZE(szPath), TEXT("%d"), m_dwCustomScale[nIndex]);
|
||
|
SetWindowText(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOORSIZE + nIndex)), szPath);
|
||
|
|
||
|
if (m_pszCustomPaths[nIndex] && m_pszCustomPaths[nIndex][0])
|
||
|
{
|
||
|
CheckDlgButton(m_hDlgAdvanced, (IDC_CHECK_TEXTR_FLOOR + nIndex), BST_CHECKED);
|
||
|
SetWindowText(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOOR + nIndex)), m_pszCustomPaths[nIndex]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
_OnEnableCustomTexture(nIndex, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CheckDlgButton(m_hDlgAdvanced, IDC_RENDERQUALITY1+m_dwAdvSettings[CONFIG_DWORD_RENDERQUALITY], BST_CHECKED);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_GetAdvState(void)
|
||
|
{
|
||
|
int nIndex;
|
||
|
|
||
|
// Set Directory Checkboxes
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_fAdvSettings); nIndex++)
|
||
|
{
|
||
|
m_fAdvSettings[nIndex] = GetCheckBox(m_hDlgAdvanced, IDC_CHECK_SHOWSTATS+nIndex);
|
||
|
}
|
||
|
|
||
|
// Copy the customized textures.
|
||
|
for (nIndex = 0; nIndex < ARRAYSIZE(m_pszCustomPaths); nIndex++)
|
||
|
{
|
||
|
if (IsDlgButtonChecked(m_hDlgAdvanced, (IDC_CHECK_TEXTR_FLOOR + nIndex)))
|
||
|
{
|
||
|
TCHAR szPath[MAX_PATH];
|
||
|
|
||
|
GetWindowText(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOOR + nIndex)), szPath, ARRAYSIZE(szPath));
|
||
|
Str_SetPtr(&(m_pszCustomPaths[nIndex]), szPath);
|
||
|
|
||
|
GetWindowText(GetDlgItem(m_hDlgAdvanced, (IDC_EDIT_TEXTR_FLOORSIZE + nIndex)), szPath, ARRAYSIZE(szPath));
|
||
|
m_dwCustomScale[nIndex] = (DWORD) StrToInt(szPath);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Str_SetPtr(&(m_pszCustomPaths[nIndex]), NULL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (BST_CHECKED == IsDlgButtonChecked(m_hDlgAdvanced, IDC_RENDERQUALITY1))
|
||
|
{
|
||
|
m_dwAdvSettings[CONFIG_DWORD_RENDERQUALITY] = 0;
|
||
|
}
|
||
|
else if (BST_CHECKED == IsDlgButtonChecked(m_hDlgAdvanced, IDC_RENDERQUALITY2))
|
||
|
{
|
||
|
m_dwAdvSettings[CONFIG_DWORD_RENDERQUALITY] = 1;
|
||
|
}
|
||
|
else if (BST_CHECKED == IsDlgButtonChecked(m_hDlgAdvanced, IDC_RENDERQUALITY3))
|
||
|
{
|
||
|
m_dwAdvSettings[CONFIG_DWORD_RENDERQUALITY] = 2;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnAdvDestroy(HWND hDlg)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CConfig::_OnAdvCommand(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
BOOL fHandled = 1; // Not handled (WM_COMMAND seems to be different)
|
||
|
WORD idCtrl = GET_WM_COMMAND_ID(wParam, lParam);
|
||
|
WORD wEvent = GET_WM_COMMAND_CMD(wParam, lParam);
|
||
|
|
||
|
switch (idCtrl)
|
||
|
{
|
||
|
case IDOK:
|
||
|
_GetAdvState();
|
||
|
EndDialog(hDlg, IDOK);
|
||
|
break;
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hDlg, IDCANCEL);
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_TEXTR_FLOOR:
|
||
|
_OnEnableCustomTexture(0, IsDlgButtonChecked(m_hDlgAdvanced, IDC_CHECK_TEXTR_FLOOR));
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_TEXTR_WALLPAPER:
|
||
|
_OnEnableCustomTexture(1, IsDlgButtonChecked(m_hDlgAdvanced, IDC_CHECK_TEXTR_WALLPAPER));
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_TEXTR_CEILING:
|
||
|
_OnEnableCustomTexture(2, IsDlgButtonChecked(m_hDlgAdvanced, IDC_CHECK_TEXTR_CEILING));
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_TEXTR_TOEGUARD:
|
||
|
_OnEnableCustomTexture(3, IsDlgButtonChecked(m_hDlgAdvanced, IDC_CHECK_TEXTR_TOEGUARD));
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_TEXTR_RUG:
|
||
|
_OnEnableCustomTexture(4, IsDlgButtonChecked(m_hDlgAdvanced, IDC_CHECK_TEXTR_RUG));
|
||
|
break;
|
||
|
|
||
|
case IDC_CHECK_TEXTR_FRAME:
|
||
|
_OnEnableCustomTexture(5, IsDlgButtonChecked(m_hDlgAdvanced, IDC_CHECK_TEXTR_FRAME));
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return fHandled;
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR CALLBACK CConfig::AdvDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
CConfig * pThis = (CConfig *)GetWindowLongPtr(hDlg, DWLP_USER);
|
||
|
|
||
|
if (WM_INITDIALOG == wMsg)
|
||
|
{
|
||
|
pThis = (CConfig *) lParam;
|
||
|
|
||
|
if (pThis)
|
||
|
{
|
||
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pThis)
|
||
|
{
|
||
|
return pThis->_AdvDlgProc(hDlg, wMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
return DefWindowProc(hDlg, wMsg, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR CConfig::_AdvDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch(message)
|
||
|
{
|
||
|
case WM_NOTIFY:
|
||
|
break;
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
_OnAdvInitDlg(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
_OnAdvDestroy(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_HELP:
|
||
|
// TODO: Get help strings
|
||
|
// WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, SZ_HELPFILE_ADVAPPEARANCE, HELP_WM_HELP, (DWORD_PTR) aAdvAppearanceHelpIds);
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU: // right mouse click
|
||
|
// WinHelp((HWND) wParam, SZ_HELPFILE_ADVAPPEARANCE, HELP_CONTEXTMENU, (DWORD_PTR) aAdvAppearanceHelpIds);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
_OnAdvCommand(hDlg, message, wParam, lParam);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|