//Copyright (c) 1998 - 1999 Microsoft Corporation #include "stdafx.h" #include #include "todlg.h" #include "resource.h" TOKTABLE tokday[ 4 ] = { { NULL , IDS_D }, { NULL , IDS_DAY }, { NULL , IDS_DAYS }, { NULL , ( DWORD )-1 } }; TOKTABLE tokhour[ 6 ] = { { NULL , IDS_H }, { NULL , IDS_HR }, { NULL , IDS_HRS }, { NULL , IDS_HOUR }, { NULL , IDS_HOURS }, { NULL , ( DWORD )-1 } }; TOKTABLE tokmin[ 5 ] = { { NULL , IDS_M }, { NULL , IDS_MIN }, { NULL , IDS_MINUTE }, { NULL , IDS_MINUTES }, { NULL , ( DWORD )-1 } }; TCHAR * GetNextToken( TCHAR *pszString , TCHAR *tchToken ); //------------------------------------------------------------------------------- // CTimeOutDlg::ctor //------------------------------------------------------------------------------- CTimeOutDlg::CTimeOutDlg( ) { ZeroMemory( &m_cbxst , sizeof( CBXSTATE ) * 3 ); } //------------------------------------------------------------------------------- BOOL CTimeOutDlg::InitControl( HWND hCtrl ) { int i = GetCBXSTATEindex( hCtrl ); m_cbxst[ i ].icbxSel = ( int )SendMessage( hCtrl , CB_GETCURSEL , 0 , 0 ); return TRUE; } //------------------------------------------------------------------------------- // release the parent reference //------------------------------------------------------------------------------- BOOL CTimeOutDlg::ReleaseAbbreviates( ) { xxxUnLoadAbbreviate( &tokday[0] ); xxxUnLoadAbbreviate( &tokhour[0] ); xxxUnLoadAbbreviate( &tokmin[0] ); return TRUE; } //------------------------------------------------------------------------------- // OnCommand //------------------------------------------------------------------------------- BOOL CTimeOutDlg::OnCommand( WORD wNotifyCode , WORD wID , HWND hwndCtl , PBOOL pfPersisted ) { UNREFERENCED_PARAMETER( wID ); switch( wNotifyCode ) { case CBN_EDITCHANGE: if( OnCBEditChange( hwndCtl ) ) { *pfPersisted = FALSE; } break; case CBN_SELCHANGE: if( OnCBNSELCHANGE( hwndCtl ) ) { *pfPersisted = FALSE; } //case BN_CLICKED: break; case CBN_DROPDOWN: // FALLTHROUGH case CBN_KILLFOCUS: OnCBDropDown( hwndCtl ); break; //return FALSE; /* case ALN_APPLY: SendMessage( GetParent( hwndCtl ) , PSM_CANCELTOCLOSE , 0 , 0 ); return FALSE; */ } // m_bPersisted = FALSE; /* if( bChange ) { SendMessage( GetParent( GetParent( hwndCtl ) ) , PSM_CHANGED , ( WPARAM )GetParent( hwndCtl ) , 0 ); } */ return FALSE; } //------------------------------------------------------------------------------- // Update the entry if it has been modified by user //------------------------------------------------------------------------------- BOOL CTimeOutDlg::OnCBDropDown( HWND hCombo ) { TCHAR tchBuffer[ 80 ]; ULONG ulTime; int i = GetCBXSTATEindex( hCombo ); if( i < 0 ) { return FALSE; } if( m_cbxst[ i ].bEdit ) { GetWindowText( hCombo , tchBuffer , SIZE_OF_BUFFER( tchBuffer ) ); if( ParseDurationEntry( tchBuffer , &ulTime ) == E_SUCCESS ) { InsertSortedAndSetCurSel( hCombo , ulTime ); } return TRUE; } return FALSE; } //------------------------------------------------------------------------------- // Use this flag to distinguish between hand entry or listbox selection // setting it to true implies that the use has edit the cbx via typing //------------------------------------------------------------------------------- BOOL CTimeOutDlg::OnCBEditChange( HWND hCombo ) { int i = GetCBXSTATEindex( hCombo ); if( i > -1 ) { m_cbxst[ i ].bEdit = TRUE; return TRUE; } return FALSE; } //------------------------------------------------------------------------------- // Determine if user wants to enter a custom time //------------------------------------------------------------------------------- BOOL CTimeOutDlg::OnCBNSELCHANGE( HWND hwnd ) { return SaveChangedSelection( hwnd ); } //------------------------------------------------------------------------------- // Saves selected item. //------------------------------------------------------------------------------- BOOL CTimeOutDlg::SaveChangedSelection( HWND hCombo ) { INT_PTR idx = SendMessage( hCombo , CB_GETCURSEL , 0 , 0 ); int i = GetCBXSTATEindex( hCombo ); if( i > -1 ) { if( m_cbxst[ i ].icbxSel != idx ) { m_cbxst[ i ].icbxSel = ( int )idx; m_cbxst[ i ].bEdit = FALSE; return TRUE; } } return FALSE; } //------------------------------------------------------------------------------- // Restore previous setting //------------------------------------------------------------------------------- BOOL CTimeOutDlg::RestorePreviousValue( HWND hwnd ) { int iSel; if( ( iSel = GetCBXSTATEindex( hwnd ) ) > -1 ) { SendMessage( hwnd , CB_SETCURSEL , m_cbxst[ iSel ].icbxSel , 0 ); return TRUE; } return FALSE; } //------------------------------------------------------------------------------- // ConvertToMinutes -- helper for CTimeOutDlg::OnNotify //------------------------------------------------------------------------------- BOOL CTimeOutDlg::ConvertToMinutes( HWND hwndCtl , PULONG pulMinutes ) { TCHAR tchBuffer[ 80 ]; TCHAR tchErrTitle[ 80 ]; TCHAR tchErrMsg[ 256 ]; TCHAR tchSetting[ 80 ]; int idx = GetCBXSTATEindex( hwndCtl ); if( idx < 0 ) { return FALSE; } ASSERT( idx <= 2 ); int resID = -1; if( idx == 0 ) { resID = IDS_COMBO_CONNECTION; } else if( idx == 1 ) { resID = IDS_COMBO_DISCONNECTION; } else if( idx == 2 ) { resID = IDS_COMBO_IDLECONNECTION; } VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , resID , tchSetting , SIZE_OF_BUFFER( tchSetting ) ) ); ULONG_PTR dw = ( ULONG_PTR )&tchSetting[ 0 ]; VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_TITLE , tchErrTitle , SIZE_OF_BUFFER( tchErrTitle ) ) ); if( m_cbxst[ idx ].bEdit ) { DBGMSG( L"Automatic %s parsing\n" , tchSetting ); if( GetWindowText( hwndCtl , tchBuffer , SIZE_OF_BUFFER( tchBuffer ) ) < 1 ) { *pulMinutes = 0; return TRUE; } LRESULT lr = ParseDurationEntry( tchBuffer , pulMinutes ); if( lr != E_SUCCESS ) { if( lr == E_PARSE_VALUEOVERFLOW ) { LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_TOOMANYDIGITS , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) ); FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchErrMsg , 0 , 0 , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) , ( va_list * )&dw ); MessageBox( hwndCtl , tchErrMsg , tchErrTitle , MB_OK | MB_ICONERROR ); SetFocus( hwndCtl ); } else if( lr == E_PARSE_MISSING_DIGITS || lr == E_PARSE_INVALID ) { LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_PARSEINVALID , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) ); FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchErrMsg , 0 , 0 , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) , ( va_list * )&dw ); MessageBox( hwndCtl , tchErrMsg , tchErrTitle , MB_OK | MB_ICONERROR ); SetFocus( hwndCtl ); } return FALSE; } } else { ODS( L"Getting current selection\n" ); INT_PTR iCurSel = SendMessage( hwndCtl , CB_GETCURSEL , 0 , 0 ); // See if user wants "No Timeout" if( iCurSel == 0 ) { *pulMinutes = 0; return TRUE; } if( ( *pulMinutes = ( ULONG )SendMessage( hwndCtl , CB_GETITEMDATA , iCurSel , 0 ) ) == CB_ERR ) { *pulMinutes = 0; } } if( *pulMinutes > kMaxTimeoutMinute ) { LoadString( _Module.GetResourceInstance( ) , IDS_ERROR_MAXVALEXCEEDED , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) ); FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchErrMsg , 0 , 0 , tchErrMsg , SIZE_OF_BUFFER( tchErrMsg ) , ( va_list * )&dw ); MessageBox( hwndCtl , tchErrMsg , tchErrTitle , MB_OK | MB_ICONERROR ); SetFocus( hwndCtl ); return FALSE; } *pulMinutes *= kMilliMinute; return TRUE; } #if 0 //------------------------------------------------------------------------------- // Lets cut to the chase and find out if this is even worth parsing //------------------------------------------------------------------------------- BOOL CTimeOutDlg::DoesContainDigits( LPTSTR pszString ) { while( *pszString ) { if( iswdigit( *pszString ) ) { return TRUE; } pszString++; } return FALSE; } //------------------------------------------------------------------------------- LRESULT CTimeOutDlg::ParseDurationEntry( LPTSTR pszTime , PULONG pTime ) { TCHAR tchNoTimeout[ 80 ]; LPTSTR pszTemp = pszTime; UINT uDec = 0; float fFrac = 0.0f; float fT; UINT uPos = 1; LoadString( _Module.GetResourceInstance( ) , IDS_NOTIMEOUT , tchNoTimeout , SIZE_OF_BUFFER( tchNoTimeout ) ); if( lstrcmpi( pszTime , tchNoTimeout ) == 0 ) { *pTime = 0; return E_SUCCESS; } if( !DoesContainDigits( pszTime ) ) { return E_PARSE_MISSING_DIGITS; } while( *pszTemp ) { if( !iswdigit( *pszTemp ) ) { break; } // check for overflow if( uDec >= 1000000000 ) { return E_PARSE_VALUEOVERFLOW ; } uDec *= 10; uDec += ( *pszTemp - '0' ); pszTemp++; } TCHAR tchSDecimal[ 5 ]; GetLocaleInfo( LOCALE_USER_DEFAULT , LOCALE_SDECIMAL , tchSDecimal , SIZE_OF_BUFFER( tchSDecimal ) ); if( *pszTemp == *tchSDecimal ) { pszTemp++; while( *pszTemp ) { if( !iswdigit( *pszTemp ) ) { break; } // check for overflow if( uDec >= 1000000000 ) { return E_PARSE_VALUEOVERFLOW; } uPos *= 10; fFrac += ( float )( *pszTemp - '0' ) / ( float )uPos; pszTemp++; } } // remove white space while( *pszTemp == L' ' ) { pszTemp++; } if( *pszTemp != NULL ) { if( IsToken( pszTemp , TOKEN_DAY ) ) { *pTime = uDec * 24 * 60; fT = ( fFrac * 24.0f * 60.0f + 0.5f ); *pTime += ( ULONG )fT; return E_SUCCESS; } else if( IsToken( pszTemp , TOKEN_HOUR ) ) { *pTime = uDec * 60; fT = ( fFrac * 60.0f + 0.5f ); *pTime += ( ULONG )fT; return E_SUCCESS; } else if( IsToken( pszTemp , TOKEN_MINUTE ) ) { // minutes are rounded up in the 1/10 place fT = fFrac + 0.5f; *pTime = uDec; *pTime += ( ULONG )( fT ); return E_SUCCESS; } } if( *pszTemp == NULL ) { // if no text is defined considered the entry in hours *pTime = uDec * 60; fT = ( fFrac * 60.0f + 0.5f ); *pTime += ( ULONG )fT ; return E_SUCCESS; } return E_PARSE_INVALID; } #endif //------------------------------------------------------------------------------- // Adds strings to table from resource //------------------------------------------------------------------------------- BOOL CTimeOutDlg::LoadAbbreviates( ) { xxxLoadAbbreviate( &tokday[0] ); xxxLoadAbbreviate( &tokhour[0] ); xxxLoadAbbreviate( &tokmin[0] ); return TRUE; } //------------------------------------------------------------------------------- // Take cares some repetitive work for us //------------------------------------------------------------------------------- BOOL CTimeOutDlg::xxxLoadAbbreviate( PTOKTABLE ptoktbl ) { int idx; int nSize; TCHAR tchbuffer[ 80 ]; if( ptoktbl == NULL ) { return FALSE; } for( idx = 0; ptoktbl[ idx ].dwresourceid != ( DWORD )-1 ; ++idx ) { nSize = LoadString( _Module.GetResourceInstance( ) , ptoktbl[ idx ].dwresourceid , tchbuffer , SIZE_OF_BUFFER( tchbuffer ) ); if( nSize > 0 ) { ptoktbl[ idx ].pszAbbrv = ( TCHAR *)new TCHAR[ nSize + 1 ]; if( ptoktbl[ idx ].pszAbbrv != NULL ) { lstrcpy( ptoktbl[ idx ].pszAbbrv , tchbuffer ); } } } return TRUE; } //------------------------------------------------------------------------------- // Frees up allocated resources //------------------------------------------------------------------------------- BOOL CTimeOutDlg::xxxUnLoadAbbreviate( PTOKTABLE ptoktbl ) { if( ptoktbl == NULL ) { return FALSE; } for( int idx = 0; ptoktbl[ idx ].dwresourceid != ( DWORD )-1 ; ++idx ) { if( ptoktbl[ idx ].pszAbbrv != NULL ) { delete[] ptoktbl[ idx ].pszAbbrv; } } return TRUE; } //------------------------------------------------------------------------------- // tear-off token tables //------------------------------------------------------------------------------- BOOL CTimeOutDlg::IsToken( LPTSTR pszString , TOKEN tok ) { TOKTABLE *ptoktable; if( tok == TOKEN_DAY ) { ptoktable = &tokday[0]; } else if( tok == TOKEN_HOUR ) { ptoktable = &tokhour[0]; } else if( tok == TOKEN_MINUTE ) { ptoktable = &tokmin[0]; } else { return FALSE; } for( int idx = 0 ; ptoktable[ idx ].dwresourceid != -1 ; ++idx ) { if( lstrcmpi( pszString , ptoktable[ idx ].pszAbbrv ) == 0 ) { return TRUE; } } return FALSE; } #if 0 //------------------------------------------------------------------------------- // Converts the number minutes into a formated string //------------------------------------------------------------------------------- BOOL CTimeOutDlg::ConvertToDuration( ULONG ulTime , LPTSTR pszDuration ) { ULONG_PTR dw[3]; TCHAR tchTimeUnit[ 40 ]; TCHAR tchTimeFormat[ 40 ]; TCHAR tchOutput[ 80 ]; // ASSERT( ulTime != 0 ); int iHour= ulTime / 60; int iDays = iHour / 24; dw[ 2 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ]; LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_DOT_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) ); if( iDays != 0 ) { int iRemainingHours = iHour % 24; float fx = ( float )iRemainingHours / 24.0f; iRemainingHours = ( int )( fx * 10 ); LoadString( _Module.GetResourceInstance( ) , IDS_DAYS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); dw[ 0 ] = iDays; dw[ 1 ] = iRemainingHours; if( iRemainingHours == 0 ) { // formatted string requires two arguments dw[ 1 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ]; LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) ); if( iDays == 1 ) { LoadString( _Module.GetResourceInstance( ) , IDS_DAY , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } } } else if( iHour != 0 ) { int iRemainingMinutes = ulTime % 60; float fx = ( float )iRemainingMinutes / 60.0f; iRemainingMinutes = ( int ) ( fx * 10 ); dw[ 0 ] = iHour; dw[ 1 ] = iRemainingMinutes; LoadString( _Module.GetResourceInstance( ) , IDS_HOURS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); if( iRemainingMinutes == 0 ) { dw[ 1 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ]; LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) ); if( iHour == 1 ) { LoadString( _Module.GetResourceInstance( ) , IDS_HOUR , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } } } else { LoadString( _Module.GetResourceInstance( ) , IDS_MINUTES , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); LoadString( _Module.GetResourceInstance( ) , IDS_DIGIT_TU , tchTimeFormat , SIZE_OF_BUFFER( tchTimeFormat ) ); dw[ 0 ] = ulTime ; dw[ 1 ] = ( ULONG_PTR )&tchTimeUnit[ 0 ]; if( ulTime > 1 ) { LoadString( _Module.GetResourceInstance( ) , IDS_MINUTES , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } else { LoadString( _Module.GetResourceInstance( ) , IDS_MINUTE , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } } FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, tchTimeFormat , 0 , 0 , tchOutput , SIZE_OF_BUFFER( tchOutput ) , ( va_list * )&dw ); lstrcpy( pszDuration , tchOutput ); return TRUE; } #endif //------------------------------------------------------------------------------- // Place entry in listbox and set as current selection //------------------------------------------------------------------------------- BOOL CTimeOutDlg::InsertSortedAndSetCurSel( HWND hCombo , DWORD dwMinutes ) { // ASSERT( dwMinutes != ( DWORD )-1 ); TCHAR tchBuffer[ 80 ]; INT_PTR iCount = SendMessage( hCombo , CB_GETCOUNT , 0 , 0 ); for( INT_PTR idx = 0 ; idx < iCount ; ++idx ) { // Don't insert an item that's already in the list if( dwMinutes == ( DWORD )SendMessage( hCombo , CB_GETITEMDATA , idx , 0 ) ) { SendMessage( hCombo , CB_SETCURSEL , idx , 0 ) ; return TRUE; } if( dwMinutes < ( DWORD )SendMessage( hCombo , CB_GETITEMDATA , idx , 0 ) ) { break; } } // hey if the value has exceeded the max timeout don't bother entering it in our list if( dwMinutes > kMaxTimeoutMinute ) { return FALSE; } if( ConvertToDuration ( dwMinutes , tchBuffer ) ) { idx = SendMessage( hCombo , CB_INSERTSTRING , idx , ( LPARAM )&tchBuffer[ 0 ] ); if( idx != CB_ERR ) { SendMessage( hCombo , CB_SETITEMDATA , idx , dwMinutes ); } SendMessage( hCombo , CB_SETCURSEL , idx , 0 ) ; } // must call this here because CB_SETCURSEL does not send CBN_SELCHANGE SaveChangedSelection( hCombo ); return TRUE; } /* Modified settings for a more readable time out settings * added 1/25/99 * alhen */ //------------------------------------------------------------------------------- // Removing decimal entries //------------------------------------------------------------------------------- LRESULT CTimeOutDlg::ParseDurationEntry( LPTSTR pszTime , PULONG pTime ) { TCHAR tchNoTimeout[ 80 ]; LPTSTR pszTemp = pszTime; UINT uDec = 0; BOOL bSetDay = FALSE; BOOL bSetHour = FALSE; BOOL bSetMin = FALSE; BOOL bEOL = FALSE; BOOL bHasDigit= FALSE; *pTime = 0; LoadString( _Module.GetResourceInstance( ) , IDS_NOTIMEOUT , tchNoTimeout , SIZE_OF_BUFFER( tchNoTimeout ) ); if( lstrcmpi( pszTime , tchNoTimeout ) == 0 ) { // *pTime = 0; return E_SUCCESS; } while( !bEOL ) { // remove leading white spaces while( *pszTemp == L' ' ) { pszTemp++; } while( *pszTemp ) { if( !iswdigit( *pszTemp ) ) { if( !bHasDigit ) { return E_PARSE_MISSING_DIGITS; } break; } // check for overflow if( uDec >= 1000000000 ) { return E_PARSE_VALUEOVERFLOW ; } uDec *= 10; uDec += ( *pszTemp - '0' ); if( !bHasDigit ) { bHasDigit = TRUE; } pszTemp++; } // remove intermediate white spaces while( *pszTemp == L' ' ) { pszTemp++; } if( *pszTemp != NULL ) { // Get next token TCHAR tchToken[ 80 ]; pszTemp = GetNextToken( pszTemp , tchToken ); if( IsToken( tchToken , TOKEN_DAY ) ) { if( !bSetDay ) { *pTime += uDec * 1440; bSetDay = TRUE; } } else if( IsToken( tchToken , TOKEN_HOUR ) ) { if( !bSetHour ) { *pTime += uDec * 60; bSetHour = TRUE; } } else if( IsToken( tchToken , TOKEN_MINUTE ) ) { if( !bSetMin ) { *pTime += uDec; bSetMin = TRUE; } } else { return E_PARSE_INVALID; } } else { if( !bSetHour ) { *pTime += uDec * 60; } bEOL = TRUE; } uDec = 0; bHasDigit = FALSE; } return E_SUCCESS; } //------------------------------------------------------------------------------- // replacing older api //------------------------------------------------------------------------------- BOOL CTimeOutDlg::ConvertToDuration( ULONG ulTime , LPTSTR pszDuration ) { // TCHAR dw[] = L"dhm"; TCHAR tchTimeUnit[ 40 ]; TCHAR tchTimeFormat[ 40 ]; TCHAR tchOutput[ 80 ]; ASSERT( ulTime != 0 ); int iHour = ( ulTime / 60 ); int iDays = iHour / 24; int iMinute = ulTime % 60; // Resolve format tchOutput[0] = 0; if( iDays > 0 ) { if( iDays == 1 ) { LoadString( _Module.GetResourceInstance( ) , IDS_DAY , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } else { LoadString( _Module.GetResourceInstance( ) , IDS_DAYS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } iHour = iHour % 24; wsprintf( tchTimeFormat , L"%d %s", iDays , tchTimeUnit ); lstrcat( tchOutput , tchTimeFormat ); lstrcat( tchOutput , L" " ); } if( iHour > 0 ) { if( iHour == 1 ) { LoadString( _Module.GetResourceInstance( ) , IDS_HOUR , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } else { LoadString( _Module.GetResourceInstance( ) , IDS_HOURS , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } wsprintf( tchTimeFormat , L"%d %s", iHour , tchTimeUnit ); lstrcat( tchOutput , tchTimeFormat ); lstrcat( tchOutput , L" " ); } if( iMinute > 0 ) { if( iMinute == 1 ) { LoadString( _Module.GetResourceInstance( ) , IDS_MINUTE , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } else { LoadString( _Module.GetResourceInstance( ) , IDS_MINUTES , tchTimeUnit , SIZE_OF_BUFFER( tchTimeUnit ) ); } wsprintf( tchTimeFormat , L"%d %s", iMinute , tchTimeUnit ); lstrcat( tchOutput , tchTimeFormat ); lstrcat( tchOutput , L" " ); } lstrcpy( pszDuration , tchOutput ); return TRUE; } //------------------------------------------------------------------------------- BOOL CTimeOutDlg::DoesContainDigits( LPTSTR pszString ) { while( *pszString ) { if( *pszString != L' ') { if( iswdigit( *pszString ) ) { return TRUE; } else { return FALSE; } pszString++; } } return FALSE; } //------------------------------------------------------------------------------- TCHAR * GetNextToken( TCHAR *pszString , TCHAR *tchToken ) { while( *pszString ) { if( IsCharAlpha( *pszString ) ) { *tchToken = *pszString; } else { break; } tchToken++; pszString++; } *tchToken = '\0'; return pszString; }