146 lines
4.1 KiB
C
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);
|
||
|
}
|