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
Codificatore - interfaccia.cpp

interfaccia.cpp

Caricato da: AldoBaldo
Scarica il programma completo

  1. #include "interfaccia.h"
  2.  
  3.  
  4. HWND CreaFinestraPrincipale( HINSTANCE hInst ) {
  5.     HWND hwnd = CreateDialog(
  6.         hInst, MAKEINTRESOURCE(kIDFinPrinc), NULL, (DLGPROC)DlgMain );
  7.  
  8.     if( hwnd == NULL ) {
  9.         Errore( "Finestra principale non creata." );
  10.     }
  11.     else {
  12.         SetWindowText( hwnd, kStrNomeProgramma );
  13.         ComponiInformazioni( hwnd );
  14.     }
  15.  
  16.     return hwnd;
  17. }
  18.  
  19. void AggiornaPulsanti( HWND hwnd, CDF *cdf ) {
  20.     HWND ctrlCod = GetDlgItem( hwnd, kIDPulsCodifica );
  21.     HWND ctrlDec = GetDlgItem( hwnd, kIDPulsDecodifica );
  22.  
  23.     if( ctrlCod!=NULL && ctrlDec!=NULL ) {
  24.         int dd = cdf->tipologia_dati();
  25.         bool chiave_valida = cdf->chiave_valida();
  26.         EnableWindow( ctrlCod, dd==kCDFInChiaro && chiave_valida );
  27.         EnableWindow( ctrlDec, dd==kCDFCodificati && chiave_valida );
  28.     }
  29. }
  30.  
  31.  
  32. void PopolaListaCaratteriMancanti( HWND hwnd, CDF *cdf ) {
  33.     static char buff[24] = "";
  34.     HWND ctrlLista = GetDlgItem( hwnd, kIDCampoCarMancanti );
  35.  
  36.     if( ctrlLista != NULL ) {
  37.         SendMessage( ctrlLista, LB_RESETCONTENT, 0, 0 );
  38.  
  39.         if( !cdf->chiave_valida() ) {
  40.             unsigned int i, nCManc = cdf->totale_caratteri_mancanti();
  41.             unsigned char c;
  42.  
  43.             SendMessage( ctrlLista, WM_SETREDRAW, FALSE, 0 );
  44.  
  45.             for( i=0; i<nCManc; ++i ) {
  46.                 c = cdf->carattere_mancante( i );
  47.                 wsprintf( buff, "%c\t(ASCII %03d)", c, (int)c );
  48.                 SendMessage( ctrlLista, LB_ADDSTRING, 0, (LPARAM)buff );
  49.             }
  50.  
  51.             SendMessage( ctrlLista, WM_SETREDRAW, TRUE, 0 );
  52.         }
  53.         else {
  54.             if( cdf->chiave_presente() ) {
  55.                 SendMessage( ctrlLista, LB_ADDSTRING,
  56.                              0, (LPARAM)"Nessun carattere mancante" );
  57.             }
  58.             else {
  59.                 SendMessage( ctrlLista, LB_ADDSTRING,
  60.                              0, (LPARAM)"Chiave assente" );
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66.  
  67. char *RicavaPrimoFileTrascinato( LPSTR lpszArgs ) {
  68.     char *esito, *e, *inizio, *fine;
  69.  
  70.     if( *lpszArgs == '\0' ) {
  71.         try {
  72.             esito = new char[1];
  73.             *esito = '\0';
  74.         } catch( ... ) {
  75.             return NULL;
  76.         }
  77.     }
  78.     else {
  79.         if( *lpszArgs == '\"' ) {
  80.             // trova l'inizio e la fine del virgolettato
  81.             for( inizio = lpszArgs; *inizio == '\"'; ++inizio );
  82.             for( fine = inizio; *fine != '\"'; ++fine );
  83.         }
  84.         else {
  85.             for( inizio=fine=lpszArgs; *fine!=' ' && *fine!='\0'; ++fine );
  86.         }
  87.  
  88.         try {
  89.             esito = new char[(fine-inizio)+1];
  90.         } catch( ... ) {
  91.             return NULL;
  92.         }
  93.  
  94.         // copia il primo parametro della command line
  95.         for( e = esito; fine > inizio; *e++ = *inizio++ );
  96.         *e = '\0';
  97.     }
  98.  
  99.     return esito;
  100. }
  101.  
  102.  
  103. /*==============================================================================
  104. "tipoFile" identifica il tipo di file che sara' riconosciuto dalla finestra di
  105. navigazione e che sarà usato come estensione di default, se del caso. Se e' NULL
  106. saranno accettati file di ogni tipo e non sara' attribuita alcuna estensione di
  107. default.
  108. "nomeFileDef" identifica il nome del file usato come default nella finestra del
  109. tipo "Salva". Se "nomeFileDef" e' un puntatore valido, la finestra usata sara'
  110. una finestra del tipo "Salva"; se e' NULL, la finestra usata sarà una finestra
  111. del tipo "Apri".
  112. ==============================================================================*/
  113.  
  114. char *ScegliFile (
  115.     HWND hwnd, const char *tipoFile, const char *nomeFileDef ) {
  116.     OPENFILENAME ofn;
  117.     char filtro[32];
  118.     char *p = filtro;
  119.     char *nomeFile;
  120.     DWORD esito;
  121.  
  122.     ZeroMemory(&ofn, sizeof(ofn));
  123.  
  124.     if( tipoFile != NULL ) {
  125.         p += wsprintf( p, "Tipo file: %s", tipoFile ) + 1;
  126.         p += wsprintf( p, "*.%s", tipoFile ) + 1;
  127.         *p = '\0';
  128.     }
  129.     else {
  130.         p += wsprintf( p, "Tutti i file (*.*)" ) + 1;
  131.         p += wsprintf( p, "*.*" ) + 1;
  132.         *p = '\0';
  133.     }
  134.  
  135.     try {
  136.         nomeFile = new char[4*MAX_PATH];
  137.         *nomeFile = '\0';
  138.     } catch( ... ) {
  139.         return NULL;
  140.     }
  141.  
  142.     if( nomeFileDef != NULL )
  143.         lstrcpy( nomeFile, nomeFileDef );
  144.  
  145.     ofn.lStructSize = sizeof(ofn);
  146.     ofn.hwndOwner = hwnd;
  147.     ofn.lpstrFilter = filtro;
  148.     ofn.lpstrFile = nomeFile;
  149.     ofn.nMaxFile = MAX_PATH;
  150.     ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
  151.                 OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY |
  152.                 OFN_NOCHANGEDIR;
  153.     ofn.lpstrDefExt = tipoFile;
  154.  
  155.     if( nomeFileDef != NULL )
  156.         esito = GetSaveFileName( &ofn );
  157.     else esito = GetOpenFileName( &ofn );
  158.  
  159.     if ( esito == FALSE ) {
  160.         if( CommDlgExtendedError() != 0 )
  161.             Errore( "Scelta file non valida.", hwnd );
  162.         delete[] nomeFile;
  163.         return NULL;
  164.     }
  165.  
  166.     return nomeFile;
  167. }
  168.  
  169.  
  170. ////////////////////////////////////////////////////////////////////////////////
  171. // Carica in memoria i dati in formato TEXT contenuti negli appunti           //
  172. // riferibili alla finestra "hFin" ("hFin" puo' essere NULL se gli appunti    //
  173. // non riguardano una particolare finestra). Il valore restituito e' il       //
  174. // puntatore a una stringa di tipo C (zero terminated) allocata               //
  175. // dinamicamente. Se non esistono appunti leggibili o se e' impossibile       //
  176. // allocare spazio in memoria per la stringa da restituire, la funzione       //
  177. // restituisce NULL.                                                          //
  178. // Il parametro opzionale "lTesto" (NULL per default) contiene l'indirizzo di //
  179. // un valore di tipo unsigned long. Se "lTesto" esprime un indirizzo diverso  //
  180. // da NULL, in esso viene immagazzinata la quantita' di caratteri contenuta   //
  181. // nella stringa restituita come valore di ritorno.                           //
  182. // Richiede che sia incluso l'header standard del C "string.h"                //
  183. ////////////////////////////////////////////////////////////////////////////////
  184.  
  185. char *RicavaAppuntiTxt( HWND hFin, unsigned long *lTesto ) {
  186.     HANDLE hClip = NULL;
  187.     char *pClip  = NULL;
  188.     char *pEsito = NULL;
  189.     unsigned long lung;
  190.  
  191.     if( OpenClipboard(hFin) ) {
  192.         if( (hClip = GetClipboardData(CF_TEXT)) != NULL ) {
  193.             if( (pClip = (char*)GlobalLock(hClip)) != NULL ) {
  194.                 lung = lstrlen( pClip );
  195.  
  196.                 // alloca spazio per il testo da restituire
  197.                 try {
  198.                     pEsito = new char[lung+1];
  199.                     // copia il testo nello spazio allocato
  200.                     lstrcpy( pEsito, pClip );
  201.                     // se richiesto, annota la lunghezza del testo
  202.                     if( lTesto != NULL ) *lTesto = lung;
  203.                 } catch( ... ) {
  204.                     ;
  205.                 }
  206.  
  207.                 GlobalUnlock( hClip );
  208.             }
  209.         }
  210.  
  211.         CloseClipboard();
  212.     }
  213.  
  214.     return pEsito;
  215. }
  216.  
  217.  
  218. char *ComponiStringaValiditaChiave( CDF *cdf ) {
  219.     static char buff[64] = "";
  220.     const char *non[2] = { " NON ", " " };
  221.     const char *esc[2] = { "!", "." };
  222.     int lStr = 0;
  223.     bool valida = cdf->chiave_valida();
  224.  
  225.     lStr = wsprintf( buff, "%s%s%s%s", "Gli appunti", non[valida],
  226.         "contengono una chiave valida", esc[valida] );
  227.  
  228.     if( valida )
  229.         wsprintf( buff+lStr, " (%d caratteri)", cdf->lunghezza_chiave() );
  230.  
  231.     return buff;
  232. }
  233.  
  234.  
  235. void AggiornaInformazioniChiave( HWND hwnd, CDF *cdf ) {
  236.     HWND ctrlEtInfo = GetDlgItem( hwnd, kIDEtAppuntiValidi );
  237.  
  238.     if( ctrlEtInfo != NULL )
  239.         SetWindowText( ctrlEtInfo, ComponiStringaValiditaChiave(cdf) );
  240. }
  241.  
  242.  
  243. void ComponiInformazioni( HWND hwnd ) {
  244.     HWND ctrlEtInfo = GetDlgItem( hwnd, kIDEtInfo );
  245.  
  246.     if( ctrlEtInfo != NULL ) {
  247.         char buff[96] = "";
  248.         char *p = buff;
  249.  
  250.         p += wsprintf( p, "%s v%d.%d",
  251.                        kStrNomeProgramma, kVersione, kSottoversione );
  252.         if( kRevisione != 0 ) p += wsprintf( p, ".%d", kRevisione );
  253.  
  254.         p += wsprintf( p, "\ndi Aldo Carpanelli\ngen/feb 2015\n" );
  255.         p += wsprintf( p, "\nBuon divertimento!    :o)" );
  256.  
  257.         SetWindowText( ctrlEtInfo, buff );
  258.     }
  259. }
  260.  
  261.  
  262. void Errore( const char *msg, HWND genitrice ) {
  263.     MessageBox( genitrice, msg, kStrNomeProgramma, MB_OK | MB_ICONERROR );
  264. }
  265.  
  266.  
  267. void Notifica( const char *msg, HWND genitrice ) {
  268.     MessageBox( genitrice, msg, kStrNomeProgramma, MB_OK | MB_ICONINFORMATION );
  269. }