/*//////////////////////////////////////////////////////////////////////////////
INCIDENZA - di Aldo Carpanelli - v 1.1.1, agosto 2015 / febbraio 2020
//////////////////////////////////////////////////////////////////////////////*/
#include <stdio.h>
#include <math.h>
#include "risorse.h"
#include "incidenza.h"
/// ===> COSTANTI <=============================================================
#define kDimBuff 31
static const char *kStrCombo[]
= { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "" };
const char kStrDatiNonValidi[] = "Dati non validi";
/// ===> VARIABILI GLOBALI ESTERNE <============================================
extern HINSTANCE gHInst;
extern WNDPROC gWPOrig;
/// ===> PROTOTIPI DELLE FUNZIONI <=============================================
void EliminaCarattere( char *str, char c );
void ImpostaCampoDato( HWND hwnd, UINT id, double dato );
void ImpostaCampoProbabilita( HWND hwnd, double probabilita );
char *FormattaNumero( const char *numStr, char *strEsito = NULL );
double RicavaDato( HWND hwnd, UINT id );
void ImpostaCifreDecimali( HWND hwnd );
void PopolaComboBox( HWND hwnd, UINT id, LPCTSTR *lista );
char SeparatoreDecimale( void );
char SeparatoreMigliaia( void );
LONG WINAPI FiltroNumerico( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar );
BOOL DecimalePresente( HWND hwnd, char sepDec );
void CambiaSepDecInPunto( char *str );
/// ===> DEFINIZIONI DELLE FUNZIONI <===========================================
void Calcola( HWND hwnd ) {
double totale = RicavaDato( hwnd, IDC_TOTALE );
double interessati = RicavaDato( hwnd, IDC_INTERESSATI );
if( totale != 0 ) {
double incidenza = 100.0*interessati/totale;
double probabilita;
if( interessati > 0 )
probabilita = totale/interessati;
else probabilita = 0.0;
ImpostaCampoDato( hwnd, IDC_INCIDENZA, incidenza );
ImpostaCampoProbabilita( hwnd, probabilita );
}
else {
SetDlgItemText( hwnd, IDC_INCIDENZA, kStrDatiNonValidi );
SetDlgItemText( hwnd, IDC_PROBABILITA, kStrDatiNonValidi );
}
// serve perche' il formato potrebbe essere stato modificato
ImpostaCampoDato( hwnd, IDC_TOTALE, totale );
ImpostaCampoDato( hwnd, IDC_INTERESSATI, interessati );
}
BOOL Inizializza( HWND hwnd ) {
PopolaComboBox( hwnd, IDC_DECIMALI, kStrCombo );
ImpostaCifreDecimali( hwnd );
ImpostaCampoDato( hwnd, IDC_TOTALE, 0.0 );
SendDlgItemMessage( hwnd, IDC_TOTALE, EM_LIMITTEXT, kDimBuff, 0 );
gWPOrig = (WNDPROC) SetWindowLong(
GetDlgItem(hwnd,IDC_TOTALE),GWL_WNDPROC,(LONG)FiltroNumerico
);
ImpostaCampoDato( hwnd, IDC_INTERESSATI, 0.0 );
SendDlgItemMessage( hwnd, IDC_INTERESSATI, EM_LIMITTEXT, kDimBuff, 0 );
gWPOrig = (WNDPROC) SetWindowLong(
GetDlgItem(hwnd,IDC_INTERESSATI),GWL_WNDPROC,(LONG)FiltroNumerico
);
Calcola( hwnd );
HWND hCtrl = GetDlgItem( hwnd, IDC_TOTALE );
SendMessage( hCtrl, EM_SETSEL, 0, -1 );
SetFocus( hCtrl );
return TRUE;
}
void GestisciCampiImmissione( HWND hwnd, WPARAM wPar, LPARAM lPar ) {
switch( HIWORD(wPar) ) {
case EN_KILLFOCUS: Calcola( hwnd ); break;
case EN_SETFOCUS: SendMessage((HWND)lPar,EM_SETSEL,0,-1); break;
default: ;
}
}
void GestisciComboboxDecimali( HWND hwnd, WPARAM wPar, LPARAM lPar ) {
if( HIWORD(wPar) == CBN_SELENDOK ) {
ImpostaCifreDecimali( hwnd );
Calcola( hwnd );
}
}
char SeparatoreDecimale( void ) {
char buffer[4];
GetLocaleInfo(
LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buffer, 4 );
return *buffer;
}
char SeparatoreMigliaia( void ) {
char buffer[4];
GetLocaleInfo(
LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, buffer, 4 );
return *buffer;
}
void EliminaCarattere( char *str, char c ) {
for( char *p=str; *p; ++p ) {
if( *p != c ) {
*str = *p;
++str;
}
}
}
void CambiaSepDecInPunto( char *str ) {
for( char sepDec=SeparatoreDecimale(); *str; ++str )
if( *str == sepDec ) *str = '.';
}
char *FormattaNumero( const char *numStr, char *strEsito ) {
static char fNStr[32];
GetNumberFormat(
LOCALE_USER_DEFAULT, 0, numStr, NULL, fNStr, 32 );
if( strEsito == NULL ) {
return fNStr;
}
else {
lstrcpy( strEsito, fNStr );
return strEsito;
}
}
void PopolaComboBox( HWND hwnd, UINT id, LPCTSTR *lista ) {
// compila la lista
for( ; **lista != '\0'; lista++ )
SendDlgItemMessage( hwnd, id, CB_ADDSTRING, 0, (LPARAM) *lista );
// seleziona il primo elemento della lista
SendDlgItemMessage( hwnd, id, CB_SETCURSEL, 2, 0 );
// imposta l'apertura della lista tramite tasti freccia
SendDlgItemMessage( hwnd, id, CB_SETEXTENDEDUI, TRUE, 0 );
}
void ImpostaCampoDato( HWND hwnd, UINT id, double dato ) {
char buff[kDimBuff+1];
sprintf( buff, "%.9lf", dato );
FormattaNumero( buff, buff );
SetDlgItemText( hwnd, id, buff );
}
double RicavaDato( HWND hwnd, UINT id ) {
char buff[kDimBuff+1];
char sepMgl = SeparatoreMigliaia();
GetDlgItemText( hwnd, id, buff, kDimBuff );
EliminaCarattere( buff, sepMgl );
CambiaSepDecInPunto( buff );
return atof( buff );
}
void ImpostaCampoProbabilita( HWND hwnd, double probabilita ) {
char buff[kDimBuff+1];
if( probabilita > 0.0 ) {
sprintf( buff, "%.9lf", probabilita );
SetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IDIGITS, "0" );
if( floor(probabilita) == probabilita )
wsprintf( buff, "1/%s", FormattaNumero(buff) );
else wsprintf( buff, "ca. 1/%s", FormattaNumero(buff) );
int sel = SendDlgItemMessage( hwnd, IDC_DECIMALI, CB_GETCURSEL, 0, 0 );
SetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IDIGITS, kStrCombo[sel] );
}
else {
lstrcpy( buff, "0" );
}
SetDlgItemText( hwnd, IDC_PROBABILITA, buff );
}
void ImpostaCifreDecimali( HWND hwnd ) {
int sel = SendDlgItemMessage( hwnd, IDC_DECIMALI, CB_GETCURSEL, 0, 0 );
SetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IDIGITS, kStrCombo[sel] );
Calcola( hwnd );
}
LONG WINAPI FiltroNumerico( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar ) {
int passa = FALSE;
switch( msg ) {
case WM_CHAR: {
char sepDec = SeparatoreDecimale();
if( (wPar >= '0' && wPar <= '9') || wPar == '\b' )
passa = TRUE;
else if( wPar == (unsigned char)sepDec )
passa = !DecimalePresente( hwnd, sepDec );
else passa = FALSE;
} break;
default:
passa = TRUE;
}
if( passa == TRUE ) {
return CallWindowProc( gWPOrig, hwnd, msg, wPar, lPar );
}
else {
MessageBeep( MB_ICONHAND );
return -1;
}
}
BOOL DecimalePresente( HWND hwnd, char sepDec ) {
char buffer[32];
char *p;
GetWindowText( hwnd, buffer, 31 );
for( p=buffer; *p!='\0'; p++ )
if( *p == sepDec ) return TRUE;
return FALSE;
}
void Info( HWND hwnd ) {
const char kStrMsgInfo[] =
"INCIDENZA\ndi Aldo Carpanelli\nv1.1.1 - 2015-20\n\n\
...che la consapevolezza \n alberghi in te! :)";
MessageBox( hwnd, kStrMsgInfo,
"Incidenza 1.1.1 -info", MB_ICONINFORMATION );
}