windows-nt/Source/XPSP1/NT/shell/osshell/themes/themesw/cb.c
2020-09-26 16:20:57 +08:00

146 lines
4.1 KiB
C

/* CB.C
Resident Code Segment // Tweak: make non-resident
Utility routines for checkboxes.
Frosting: Master Theme Selector for Windows '95
Copyright (c) 1994-1998 Microsoft Corporation
*/
// ---------------------------------------------
// Brief file history:
// Alpha:
// Beta:
// Bug fixes
// ---------
//
// ---------------------------------------------
#include "windows.h"
#include "frost.h"
#include "global.h"
//
// InitCheckboxes
// Actually, you are init'ing the stored state of the checkboxes.
// All from saved registry values initially; or just checked if no stored
// values. This gets picked up on the first call to EnableThemeButtons().
//
void FAR InitCheckboxes()
{
extern TCHAR szPlus_CBs[];
LONG lret;
HKEY hKey;
int iter;
TCHAR szState[5];
DWORD dwSize;
DWORD dwType;
// we're going to try to read from the registry
lret = RegOpenKeyEx( HKEY_CURRENT_USER, szPlus_CBs,
(DWORD)0, KEY_QUERY_VALUE, (PHKEY)&hKey );
// check that you got a good key here
if (lret == ERROR_SUCCESS) {
// go through each checkbox and read stored state from registry
for (iter = 0; iter < MAX_FCHECKS; iter ++) {
// first do paranoid check of data size
lret = RegQueryValueEx(hKey, (LPTSTR)szCBNames[iter], (LPDWORD)NULL,
(LPDWORD)&dwType, (LPBYTE)NULL, (LPDWORD)&dwSize);
if (ERROR_SUCCESS == lret) {
// here's the size check before getting the data
if (dwSize > ((DWORD)5 * sizeof(TCHAR))) {
Assert(FALSE, TEXT("Large entry for checkbox state!\n"));
lret = ERROR_SUCCESS - 5; // set error flag for check below
}
else
//
// now really get the value
lret = RegQueryValueEx(hKey, (LPTSTR)szCBNames[iter], (LPDWORD)NULL,
(LPDWORD)&dwType, (LPBYTE)szState, (LPDWORD)&dwSize);
}
//
// if you got something, go ahead and use it to set checkbox state!
//
if (ERROR_SUCCESS == lret) {
// invalid value defaults to TRUE/checked, so check for valid FALSE/unchecked
bCBStates[iter] = (szState[0] == TEXT('0') ? FALSE : TRUE);
}
// otherwise, use ultimate error case
else {
Assert(FALSE, TEXT("couldn't read one of the checkbox states\n"));
// always easy worst case default: just init to checked
// Except for CB_SCHEDULE -- if it can't be read we want
// to default to off.
if (FC_SCHEDULE == iter) bCBStates[iter] = FALSE;
else bCBStates[iter] = TRUE;
}
}
// cleanup
RegCloseKey(hKey);
}
else { // couldn't open key, so just set to checked
Assert(FALSE, TEXT("problem opening Checkbox registry to init checkboxes\n"));
for (iter = 0; iter < MAX_FCHECKS; iter ++) {
if (FC_SCHEDULE == iter) bCBStates[iter] = FALSE;
else bCBStates[iter] = TRUE;
}
}
}
//
// Save/RestoreCheckboxes
// Save/Restore the state of the checkboxes to/from the states array.
// The checkbox ID array defines order saved in the states array.
//
// Globals: sets values in global bCBStates[] array.
//
void FAR SaveCheckboxes()
{
int iter;
for (iter = 0; iter < MAX_FCHECKS; iter ++) {
bCBStates[iter] = IsDlgButtonChecked(hWndApp, iCBIDs[iter]);
}
}
//
// Assumes caller has already enabled all the buttons so they can be checked.
void FAR RestoreCheckboxes()
{
int iter;
for (iter = 0; iter < MAX_FCHECKS; iter ++) {
CheckDlgButton(hWndApp, iCBIDs[iter], bCBStates[iter]);
}
}
// IsAnyBoxChecked()
//
// Returns TRUE if any of the theme setting checkboxes are checked.
// We ignore the SCHEDULE checkbox setting.
BOOL FAR IsAnyBoxChecked()
{
BOOL bRet = FALSE;
int iter;
for (iter = 0;
(iter < MAX_FCHECKS) && !bRet;
iter ++) {
if (FC_SCHEDULE != iter)
{
bRet = bRet | IsDlgButtonChecked(hWndApp, iCBIDs[iter]);
}
}
return (bRet);
}