Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Incidenza - incidenza.cpp

incidenza.cpp

Caricato da: AldoBaldo
Scarica il programma completo

  1. /*//////////////////////////////////////////////////////////////////////////////
  2.  INCIDENZA - di Aldo Carpanelli - v 1.1.1, agosto 2015 / febbraio 2020
  3. //////////////////////////////////////////////////////////////////////////////*/
  4.  
  5. #include <stdio.h>
  6. #include <math.h>
  7. #include "risorse.h"
  8. #include "incidenza.h"
  9.  
  10.  
  11. /// ===> COSTANTI <=============================================================
  12.  
  13. #define kDimBuff    31
  14.  
  15. static const char *kStrCombo[]
  16.     = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "" };
  17.  
  18. const char kStrDatiNonValidi[] = "Dati non validi";
  19.  
  20.  
  21. /// ===> VARIABILI GLOBALI ESTERNE <============================================
  22.  
  23. extern HINSTANCE gHInst;
  24. extern WNDPROC gWPOrig;
  25.  
  26.  
  27. /// ===> PROTOTIPI DELLE FUNZIONI <=============================================
  28.  
  29. void EliminaCarattere( char *str, char c );
  30. void ImpostaCampoDato( HWND hwnd, UINT id, double dato );
  31. void ImpostaCampoProbabilita( HWND hwnd, double probabilita );
  32. char *FormattaNumero( const char *numStr, char *strEsito = NULL );
  33. double RicavaDato( HWND hwnd, UINT id );
  34. void ImpostaCifreDecimali( HWND hwnd );
  35. void PopolaComboBox( HWND hwnd, UINT id, LPCTSTR *lista );
  36.  
  37. char SeparatoreDecimale( void );
  38. char SeparatoreMigliaia( void );
  39. LONG WINAPI FiltroNumerico( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar );
  40. BOOL DecimalePresente( HWND hwnd, char sepDec );
  41. void CambiaSepDecInPunto( char *str );
  42.  
  43.  
  44. /// ===> DEFINIZIONI DELLE FUNZIONI <===========================================
  45.  
  46. void Calcola( HWND hwnd ) {
  47.     double totale = RicavaDato( hwnd, IDC_TOTALE );
  48.     double interessati = RicavaDato( hwnd, IDC_INTERESSATI );
  49.  
  50.     if( totale != 0 ) {
  51.         double incidenza = 100.0*interessati/totale;
  52.         double probabilita;
  53.  
  54.         if( interessati > 0 )
  55.             probabilita = totale/interessati;
  56.         else probabilita = 0.0;
  57.  
  58.         ImpostaCampoDato( hwnd, IDC_INCIDENZA, incidenza );
  59.         ImpostaCampoProbabilita( hwnd, probabilita );
  60.     }
  61.     else {
  62.         SetDlgItemText( hwnd, IDC_INCIDENZA, kStrDatiNonValidi );
  63.         SetDlgItemText( hwnd, IDC_PROBABILITA, kStrDatiNonValidi );
  64.     }
  65.  
  66.     // serve perche' il formato potrebbe essere stato modificato
  67.     ImpostaCampoDato( hwnd, IDC_TOTALE, totale );
  68.     ImpostaCampoDato( hwnd, IDC_INTERESSATI, interessati );
  69. }
  70.  
  71.  
  72. BOOL Inizializza( HWND hwnd ) {
  73.     PopolaComboBox( hwnd, IDC_DECIMALI, kStrCombo );
  74.  
  75.     ImpostaCifreDecimali( hwnd );
  76.  
  77.     ImpostaCampoDato( hwnd, IDC_TOTALE, 0.0 );
  78.     SendDlgItemMessage( hwnd, IDC_TOTALE, EM_LIMITTEXT, kDimBuff, 0 );
  79.     gWPOrig = (WNDPROC) SetWindowLong(
  80.         GetDlgItem(hwnd,IDC_TOTALE),GWL_WNDPROC,(LONG)FiltroNumerico
  81.     );
  82.  
  83.     ImpostaCampoDato( hwnd, IDC_INTERESSATI, 0.0 );
  84.     SendDlgItemMessage( hwnd, IDC_INTERESSATI, EM_LIMITTEXT, kDimBuff, 0 );
  85.     gWPOrig = (WNDPROC) SetWindowLong(
  86.         GetDlgItem(hwnd,IDC_INTERESSATI),GWL_WNDPROC,(LONG)FiltroNumerico
  87.     );
  88.  
  89.     Calcola( hwnd );
  90.  
  91.     HWND hCtrl = GetDlgItem( hwnd, IDC_TOTALE );
  92.     SendMessage( hCtrl, EM_SETSEL, 0, -1 );
  93.     SetFocus( hCtrl );
  94.  
  95.     return TRUE;
  96. }
  97.  
  98.  
  99. void GestisciCampiImmissione( HWND hwnd, WPARAM wPar, LPARAM lPar ) {
  100.     switch( HIWORD(wPar) ) {
  101.         case EN_KILLFOCUS: Calcola( hwnd ); break;
  102.         case EN_SETFOCUS: SendMessage((HWND)lPar,EM_SETSEL,0,-1); break;
  103.         default: ;
  104.     }
  105. }
  106.  
  107.  
  108. void GestisciComboboxDecimali( HWND hwnd, WPARAM wPar, LPARAM lPar ) {
  109.     if( HIWORD(wPar) == CBN_SELENDOK ) {
  110.         ImpostaCifreDecimali( hwnd );
  111.         Calcola( hwnd );
  112.     }
  113. }
  114.  
  115.  
  116. char SeparatoreDecimale( void ) {
  117.     char buffer[4];
  118.  
  119.     GetLocaleInfo(
  120.         LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buffer, 4 );
  121.  
  122.     return *buffer;
  123. }
  124.  
  125.  
  126. char SeparatoreMigliaia( void ) {
  127.     char buffer[4];
  128.  
  129.     GetLocaleInfo(
  130.         LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, buffer, 4 );
  131.  
  132.     return *buffer;
  133. }
  134.  
  135.  
  136. void EliminaCarattere( char *str, char c ) {
  137.     for( char *p=str; *p; ++p ) {
  138.         if( *p != c ) {
  139.             *str = *p;
  140.             ++str;
  141.         }
  142.     }
  143. }
  144.  
  145.  
  146. void CambiaSepDecInPunto( char *str ) {
  147.     for( char sepDec=SeparatoreDecimale(); *str; ++str )
  148.         if( *str == sepDec ) *str = '.';
  149. }
  150.  
  151.  
  152. char *FormattaNumero( const char *numStr, char *strEsito ) {
  153.     static char fNStr[32];
  154.  
  155.     GetNumberFormat(
  156.         LOCALE_USER_DEFAULT, 0, numStr, NULL, fNStr, 32 );
  157.  
  158.     if( strEsito == NULL ) {
  159.         return fNStr;
  160.     }
  161.     else {
  162.         lstrcpy( strEsito, fNStr );
  163.         return strEsito;
  164.     }
  165. }
  166.  
  167.  
  168. void PopolaComboBox( HWND hwnd, UINT id, LPCTSTR *lista ) {
  169.     // compila la lista
  170.     for( ; **lista != '\0'; lista++ )
  171.         SendDlgItemMessage( hwnd, id, CB_ADDSTRING, 0, (LPARAM) *lista );
  172.  
  173.     // seleziona il primo elemento della lista
  174.     SendDlgItemMessage( hwnd, id, CB_SETCURSEL, 2, 0 );
  175.  
  176.     // imposta l'apertura della lista tramite tasti freccia
  177.     SendDlgItemMessage( hwnd, id, CB_SETEXTENDEDUI, TRUE, 0 );
  178. }
  179.  
  180.  
  181. void ImpostaCampoDato( HWND hwnd, UINT id, double dato ) {
  182.     char buff[kDimBuff+1];
  183.     sprintf( buff, "%.9lf", dato );
  184.     FormattaNumero( buff, buff );
  185.     SetDlgItemText( hwnd, id, buff );
  186. }
  187.  
  188.  
  189. double RicavaDato( HWND hwnd, UINT id ) {
  190.     char buff[kDimBuff+1];
  191.     char sepMgl = SeparatoreMigliaia();
  192.     GetDlgItemText( hwnd, id, buff, kDimBuff );
  193.     EliminaCarattere( buff, sepMgl );
  194.     CambiaSepDecInPunto( buff );
  195.     return atof( buff );
  196. }
  197.  
  198.  
  199. void ImpostaCampoProbabilita( HWND hwnd, double probabilita ) {
  200.     char buff[kDimBuff+1];
  201.  
  202.     if( probabilita > 0.0 ) {
  203.         sprintf( buff, "%.9lf", probabilita );
  204.         SetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IDIGITS, "0" );
  205.         if( floor(probabilita) == probabilita )
  206.             wsprintf( buff, "1/%s", FormattaNumero(buff) );
  207.         else wsprintf( buff, "ca. 1/%s", FormattaNumero(buff) );
  208.         int sel = SendDlgItemMessage( hwnd, IDC_DECIMALI, CB_GETCURSEL, 0, 0 );
  209.         SetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IDIGITS, kStrCombo[sel] );
  210.     }
  211.     else {
  212.         lstrcpy( buff, "0" );
  213.     }
  214.  
  215.     SetDlgItemText( hwnd, IDC_PROBABILITA, buff );
  216. }
  217.  
  218.  
  219. void ImpostaCifreDecimali( HWND hwnd ) {
  220.     int sel = SendDlgItemMessage( hwnd, IDC_DECIMALI, CB_GETCURSEL, 0, 0 );
  221.     SetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_IDIGITS, kStrCombo[sel] );
  222.     Calcola( hwnd );
  223. }
  224.  
  225.  
  226. LONG WINAPI FiltroNumerico( HWND hwnd, UINT msg, WPARAM wPar, LPARAM lPar ) {
  227.     int passa = FALSE;
  228.  
  229.     switch( msg ) {
  230.  
  231.         case WM_CHAR: {
  232.             char sepDec = SeparatoreDecimale();
  233.             if( (wPar >= '0' && wPar <= '9') || wPar == '\b' )
  234.                 passa = TRUE;
  235.             else if( wPar == (unsigned char)sepDec )
  236.                 passa = !DecimalePresente( hwnd, sepDec );
  237.             else passa = FALSE;
  238.             } break;
  239.  
  240.         default:
  241.             passa = TRUE;
  242.     }
  243.  
  244.     if( passa == TRUE ) {
  245.         return CallWindowProc( gWPOrig, hwnd, msg, wPar, lPar );
  246.     }
  247.     else {
  248.         MessageBeep( MB_ICONHAND );
  249.         return -1;
  250.     }
  251. }
  252.  
  253.  
  254. BOOL DecimalePresente( HWND hwnd, char sepDec ) {
  255.     char buffer[32];
  256.     char *p;
  257.  
  258.     GetWindowText( hwnd, buffer, 31 );
  259.  
  260.     for( p=buffer; *p!='\0'; p++ )
  261.         if( *p == sepDec ) return TRUE;
  262.  
  263.     return FALSE;
  264. }
  265.  
  266.  
  267. void Info( HWND hwnd ) {
  268.     const char kStrMsgInfo[] =
  269. "INCIDENZA\ndi Aldo Carpanelli\nv1.1.1 - 2015-20\n\n\
  270. ...che la consapevolezza \n    alberghi in te!      :)";
  271.  
  272.     MessageBox( hwnd, kStrMsgInfo,
  273.         "Incidenza 1.1.1 -info", MB_ICONINFORMATION );
  274. }