/******************************Module*Header*******************************\ * Module Name: preferen.c * * Code to support the preferneces dialog box. * * * Created: dd-mm-94 * Author: Stephen Estrop [StephenE] * * Copyright (c) 1994 Microsoft Corporation \**************************************************************************/ #pragma warning( once : 4201 4214 ) #define NOOLE #include /* required for all Windows applications */ #include #include "resource.h" #include "cdplayer.h" #include "preferen.h" /* -------------------------------------------------------------------- ** Other stuff ** -------------------------------------------------------------------- */ #include WNDPROC lpfnDefBtnProc; HWND hwndPrefDlg; LRESULT CALLBACK SubClassedBtnProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ); /* ------------------------------------------------------------------------- ** Private Globals ** ------------------------------------------------------------------------- */ BOOL fSmallFont; /******************************Public*Routine******************************\ * PreferencesDlgProc * * * * History: * dd-mm-93 - StephenE - Created * \**************************************************************************/ BOOL CALLBACK PreferencesDlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { #if WINVER >= 0x0400 #include "literals.h" #include "helpids.h" static const DWORD aIds[] = { IDC_STOP_CD_ON_EXIT, IDH_CD_STOP_CD_ON_EXIT, IDC_SAVE_ON_EXIT, IDH_CD_SAVE_ON_EXIT, IDC_SHOW_TOOLTIPS, IDH_CD_SHOW_TOOLTIPS, IDC_INTRO_PLAY_LEN, IDH_CD_INTRO_LENGTH, IDC_INTRO_SPINBTN, IDH_CD_INTRO_LENGTH, IDC_SMALL_FONT, IDH_CD_DISPLAY_FONT, IDC_LARGE_FONT, IDH_CD_DISPLAY_FONT, IDC_LED_DISPLAY, IDH_CD_DISPLAY_FONT, 0, 0 }; #endif switch ( message ) { HANDLE_MSG( hwnd, WM_INITDIALOG, Preferences_OnInitDialog ); HANDLE_MSG( hwnd, WM_COMMAND, Preferences_OnCommand ); #ifdef DAYTONA HANDLE_MSG( hwnd, WM_CTLCOLORDLG, Common_OnCtlColor ); HANDLE_MSG( hwnd, WM_CTLCOLORSTATIC, Common_OnCtlColor ); HANDLE_MSG( hwnd, WM_CTLCOLORBTN, Common_OnCtlColor ); #endif #if WINVER >= 0x0400 case WM_HELP: WinHelp( ((LPHELPINFO)lParam)->hItemHandle, g_HelpFileName, HELP_WM_HELP, (DWORD)(LPVOID)aIds ); break; case WM_CONTEXTMENU: WinHelp( (HWND)wParam, g_HelpFileName, HELP_CONTEXTMENU, (DWORD)(LPVOID)aIds ); break; #endif default: return FALSE; } } /*****************************Private*Routine******************************\ * Preferences_OnInitDialog * * * * History: * dd-mm-94 - StephenE - Created * \**************************************************************************/ BOOL Preferences_OnInitDialog( HWND hwnd, HWND hwndFocus, LPARAM lParam ) { fSmallFont = g_fSmallLedFont; if (!g_fSmallLedFont) { LED_ToggleDisplayFont( GetDlgItem( hwnd, IDC_LED_DISPLAY ), g_fSmallLedFont ); } Button_SetCheck( GetDlgItem( hwnd, IDC_SMALL_FONT ), g_fSmallLedFont ); Button_SetCheck( GetDlgItem( hwnd, IDC_LARGE_FONT ), !g_fSmallLedFont ); Button_SetCheck( GetDlgItem( hwnd, IDC_STOP_CD_ON_EXIT ), g_fStopCDOnExit ); Button_SetCheck( GetDlgItem( hwnd, IDC_SAVE_ON_EXIT ), g_fSaveOnExit ); Button_SetCheck( GetDlgItem( hwnd, IDC_SHOW_TOOLTIPS ), g_fToolTips ); #if WINVER >= 0x400 /* ** Set up the intro play length edit field */ Edit_LimitText( GetDlgItem( hwnd, IDC_INTRO_PLAY_LEN ), 2 ); SetDlgItemInt( hwnd, IDC_INTRO_PLAY_LEN, g_IntroPlayLength, TRUE ); SendDlgItemMessage( hwnd, IDC_INTRO_SPINBTN, UDM_SETRANGE, 0, MAKELPARAM( INTRO_UPPER_LEN, INTRO_LOWER_LEN) ); /* ** Subclass the OK button so that we can perform validation on the ** intro play length. */ lpfnDefBtnProc = SubclassWindow( GetDlgItem(hwnd, IDOK), SubClassedBtnProc ); hwndPrefDlg = hwnd; #endif return TRUE; } /*****************************Private*Routine******************************\ * Preferences_OnCommand * * * * History: * dd-mm-94 - StephenE - Created * \**************************************************************************/ void Preferences_OnCommand( HWND hwnd, int id, HWND hwndCtl, UINT codeNotify ) { switch (id) { case IDC_SMALL_FONT: if (!fSmallFont) { fSmallFont = TRUE; LED_ToggleDisplayFont( GetDlgItem( hwnd, IDC_LED_DISPLAY ), fSmallFont ); } break; case IDC_LARGE_FONT: if (fSmallFont) { fSmallFont = FALSE; LED_ToggleDisplayFont( GetDlgItem( hwnd, IDC_LED_DISPLAY ), fSmallFont ); } break; case IDOK: if ( fSmallFont != g_fSmallLedFont ) { g_fSmallLedFont = fSmallFont; LED_ToggleDisplayFont( g_hwndControls[INDEX(IDC_LED)], g_fSmallLedFont ); UpdateDisplay( DISPLAY_UPD_LED ); } g_fToolTips = Button_GetCheck( GetDlgItem( hwnd, IDC_SHOW_TOOLTIPS )); EnableToolTips( g_fToolTips ); g_fSaveOnExit = Button_GetCheck( GetDlgItem( hwnd, IDC_SAVE_ON_EXIT ) ); g_fStopCDOnExit = Button_GetCheck( GetDlgItem( hwnd, IDC_STOP_CD_ON_EXIT ) ); #if WINVER >= 0x400 { BOOL fSuccess; g_IntroPlayLength = (int)GetDlgItemInt( hwnd, IDC_INTRO_PLAY_LEN, &fSuccess, TRUE ); /* ** As the edit field has already been validated the call above ** should not fail. But just make one final check... */ if (!fSuccess) { g_IntroPlayLength = 10; } /* ** Make sure that the intro length is kept within its correct ** bounds. */ g_IntroPlayLength = min(g_IntroPlayLength, INTRO_UPPER_LEN); g_IntroPlayLength = max(g_IntroPlayLength, INTRO_LOWER_LEN); } #endif /* fall thru */ case IDCANCEL: EndDialog( hwnd, id ); break; } } #if WINVER >= 0x400 /*****************************Private*Routine******************************\ * SubClassedBtnProc * * This function is used to ensure that the Intro play length edit field * always contains a valid integer number. Valid numbers are between * INTRO_LOWER_LEN and INTRO_UPPER_LEN inclusive. * ie. INTRO_LOWER_LEN >= i >= INTRO_UPPER_LEN * * History: * dd-mm-94 - StephenE - Created * \**************************************************************************/ LRESULT CALLBACK SubClassedBtnProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { /* ** When the user clicks on the OK button we get a BM_SETSTATE message ** with wParam != 0. When we get this message we should ensure that ** the Intro length edit box contains a valid integer number. */ if ( (message == BM_SETSTATE) && (wParam != 0) ) { BOOL fSuccess; int i; /* ** Read the current edit field value. */ i = (int)GetDlgItemInt( hwndPrefDlg, IDC_INTRO_PLAY_LEN, &fSuccess, TRUE ); /* ** if the above call failed it probably means that the users ** has entered junk in the edit field - so default back to the ** original value of g_IntroPlayLength. */ if (!fSuccess) { i = g_IntroPlayLength; } /* ** Make sure that the intro length is kept within its correct ** bounds. */ if (i < INTRO_LOWER_LEN) { i = INTRO_LOWER_LEN; fSuccess = FALSE; } else if (i > INTRO_UPPER_LEN) { i = INTRO_UPPER_LEN; fSuccess = FALSE; } /* ** We only update the edit field if its value has ** become invalid. */ if (!fSuccess) { SetDlgItemInt( hwndPrefDlg, IDC_INTRO_PLAY_LEN, i, TRUE ); UpdateWindow( GetDlgItem( hwndPrefDlg, IDC_INTRO_PLAY_LEN ) ); } } /* ** Make sure that we pass on all messages to the buttons original ** window proc. */ return CallWindowProc( lpfnDefBtnProc, hwnd, message, wParam, lParam); } #endif