#include "inizializzazione.h"
extern const char *kStrNomiPulsanti[kTotPulsanti];
// collocazione e dimensioni degli elementi dell'interfaccia
static const UINT margine = 0.0125f*kWFinPrinc;
static const UINT wElenchi = 0.4f*(kWFinPrinc-4*margine);
static const UINT wEstratto = kWFinPrinc-2*margine;
static const UINT wPulsanti = kWFinPrinc-4*margine-2*wElenchi;
static const UINT hEstratto = 0.135f*(kHFinPrinc-3.50f*margine);
static const UINT hEtElenchi = 1.75f*margine;
static const UINT hElenchi = kHFinPrinc-3.25f*margine-hEtElenchi-hEstratto;
static const UINT hPulsanti = 0.085f*kHFinPrinc;
static const UINT hInfo = kHFinPrinc-(9.25f*margine+hEstratto+hEtElenchi+6.50f*hPulsanti);
static const REAL dimFontEstr = 0.55f*hEstratto;
static const REAL dimFontEl = 0.0286f*hElenchi;
static const REAL dimFontPuls = 0.5f*hPulsanti;
/// === FUNZIONE DI SUPPORTO A WINMAIN() =======================================
UINT RegistraClasseFinestraPrincipale( GLOBALE *g ) {
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = MainWndProc;
wc.hInstance = g->hndIstanza;
wc.hIcon = LoadIcon ( g->hndIstanza, MAKEINTRESOURCE(IDI_ICONAPROGRAMMA) );
if( wc.hIcon == NULL ) return kErrClasseNonRegistrata;
wc.hIconSm = LoadIcon( g->hndIstanza, MAKEINTRESOURCE(IDI_ICONAPROGRAMMA) );
if( wc.hIconSm == NULL ) return kErrClasseNonRegistrata;
wc.hbrBackground = CreateSolidBrush( kColoreSfondoFinestraPrincipale );
if( wc.hbrBackground == NULL ) return kErrClasseNonRegistrata;
wc.lpszClassName = kStrNomeClasse;
if( RegisterClassEx(&wc) != 0 )
return kErrNessunErrore;
else return kErrClasseNonRegistrata;
}
/// === FUNZIONE DI SUPPORTO A WINMAIN() =======================================
UINT CreaFinestraPrincipale( HWND *hwnd, GLOBALE *g, int nCmdShow ) {
RECT wndRect = { 0, 0, kWFinPrinc, kHFinPrinc };
AdjustWindowRectEx( &wndRect, kStileFinPrinc, FALSE, kStileExtFinPrinc );
int wFin = wndRect.right - wndRect.left;
int hFin = wndRect.bottom - wndRect.top;
if( wFin > kWInizialeSchermo || hFin > kHInizialeSchermo )
return kErrSchermoTroppoPiccolo;
*hwnd = CreateWindowEx(
kStileExtFinPrinc,
kStrNomeClasse,
kStrNomeProgramma,
kStileFinPrinc,
(kWInizialeSchermo-wFin)/2, // centrata
(kHInizialeSchermo-hFin)/2, // centrata
wFin, hFin,
GetDesktopWindow(), // la genitrice
(HMENU) NULL, // il menu
g->hndIstanza, NULL);
if( *hwnd == NULL ) return kErrFinestraNonCreata;
// "collega" g alla finestra appena creata
SetLastError( 0 );
LONG esito = SetWindowLong( *hwnd, GWL_USERDATA, (LONG)g );
if( esito==0 && GetLastError()!=0 ) return kErrFinestraNonCreata;
ShowWindow( *hwnd, nCmdShow );
return kErrNessunErrore;
}
UINT RicavaPercorsoFile( HWND hwnd, GLOBALE *g, LPSTR lpCmdLine ) {
if( (g->percorso_file=RicavaPrimoFileTrascinato(lpCmdLine)) == NULL )
return kErrMemoriaInsufficiente;
if( *g->percorso_file == '\0' )
g->percorso_file = IdentificaFile( hwnd, kStrEstensioneFile );
return kErrNessunErrore;
}
/// === FUNZIONE DI SUPPORTO A WINMAIN() =======================================
// Chiamata PRIMA della creazione della finestra principale del programma
UINT InizializzaGlobale( GLOBALE *g, HINSTANCE hndIstanza ) {
UINT errore = kErrNessunErrore;
g->hndIstanza = hndIstanza;
errore = InizializzaGdiPlus();
return errore;
}
static int CaricaScorciatoie( HWND hwnd );
static int CaricaCursore( HWND hwnd );
static int CreaOffscreen( HWND hwnd );
static int CreaRiquadri( HWND hwnd );
static int CreaEstrazione( HWND hwnd, const char *dati );
// Chiamata DOPO la creazione della finestra principale del programma
UINT InizializzaProgramma( HWND hwnd ) {
GLOBALE *g = RicavaDatiGlobali( hwnd );
UINT errore = kErrNessunErrore;
if( (errore=CaricaScorciatoie(hwnd))!=kErrNessunErrore ) return errore;
if( (errore=CaricaCursore(hwnd))!=kErrNessunErrore ) return errore;
const char *dati = CaricaFileDiTesto( g->percorso_file );
if( dati == NULL ) return kErrDatiNonCaricati;
errore = CreaEstrazione( hwnd, dati );
if( errore!=kErrNessunErrore )
{ delete[] dati; return errore; }
else delete[] dati;
if( (errore=CreaOffscreen(hwnd))!=kErrNessunErrore ) return errore;
if( (errore=CreaRiquadri(hwnd))!=kErrNessunErrore ) return errore;
AggiornaStatoPulsanti( hwnd );
TracciaFinestraPrincipale( hwnd );
return errore;
}
int CaricaScorciatoie( HWND hwnd ) {
GLOBALE *g = RicavaDatiGlobali( hwnd );
g->hndScorciatoie = LoadAccelerators(
g->hndIstanza, MAKEINTRESOURCE(IDR_SCORCIATOIE) );
if( g->hndScorciatoie == NULL )
return kErrScorciatoieNonCaricate;
else return kErrNessunErrore;
}
int CaricaCursore( HWND hwnd ) {
GLOBALE *g = RicavaDatiGlobali( hwnd );
g->hndCursore[kCursoreFreccia] = LoadCursor( NULL, IDC_ARROW );
if( g->hndCursore[kCursoreFreccia] == NULL ) return kErrCursoreNonCaricato;
SetCursor( g->hndCursore[kCursoreFreccia] );
g->hndCursore[kCursoreMano] = LoadCursor( NULL, IDC_HAND );
if( g->hndCursore[kCursoreMano] == NULL )
return kErrCursoreNonCaricato;
else return kErrNessunErrore;
}
int CreaOffscreen( HWND hwnd ) {
GLOBALE *g = RicavaDatiGlobali( hwnd );
try { // crea l'offscreen
g->os = new OFFSCREEN( hwnd );
g->os->set_sfondo( kColoreSfondoFinestraPrincipale );
g->os->cancella();
return kErrNessunErrore;
} catch( const char *err ) {
return kErrOffscreenNonValido;
}
}
int CreaRiquadri( HWND hwnd ) {
GLOBALE *g = RicavaDatiGlobali( hwnd );
int i, x, y, wBordo;
try { // crea il riquadro del nome estratto
wBordo = 0.00416f*kWFinPrinc>1 ? 0.00416f*kWFinPrinc : 1;
x = margine;
y = margine;
g->riqEstratto = new PULSANTE( x,y,wEstratto,hEstratto );
g->riqEstratto->set_offscreen( g->os );
g->riqEstratto->set_dimensione_font( dimFontEstr, FALSE );
g->riqEstratto->set_spessore_bordo( wBordo, FALSE );
g->riqEstratto->set_colori_tratto(
0xFF666666, 0xFF000000, 0xFFFF9900, 0xFFFF9900, 0xFF000000 );
} catch( const char *err ) {
return kErrRiqElenchiNonCreati;
}
try { // crea i riquadri degli elenchi
wBordo = 0.00208f*kWFinPrinc>1 ? 0.00208f*kWFinPrinc : 1;
x = margine;
y = hEstratto+2.25f*margine+hEtElenchi;
for( i=0; i<kTotElenchi; x+=wElenchi+margine, ++i ) {
g->riqElenchi[i] = new PULSANTE( x,y,wElenchi,hElenchi );
g->riqElenchi[i]->set_offscreen( g->os );
g->riqElenchi[i]->set_dimensione_font( dimFontEl, FALSE );
g->riqElenchi[i]->set_allineamento_verticale( -1, FALSE );
g->riqElenchi[i]->set_allineamento_orizzontale( -1, FALSE );
g->riqElenchi[i]->set_spessore_bordo( wBordo, FALSE );
}
} catch( const char *err ) {
return kErrRiqElenchiNonCreati;
}
try { // crea le etichette degli elenchi
x = margine;
y = 2*margine+hEstratto;
for( i=0; i<kTotElenchi; x+=wElenchi+margine, ++i ) {
g->riqEtElenchi[i] = new PULSANTE( x,y,wElenchi,hEtElenchi );
g->riqEtElenchi[i]->set_offscreen( g->os );
g->riqEtElenchi[i]->set_dimensione_font( dimFontEl, FALSE );
g->riqEtElenchi[i]->set_allineamento_verticale( -1, FALSE );
g->riqEtElenchi[i]->set_allineamento_orizzontale( -1, FALSE );
g->riqEtElenchi[i]->set_spessore_bordo( 0, FALSE );
}
} catch( const char *err ) {
return kErrRiqElenchiNonCreati;
}
try { // crea i pulsanti
x = 3*margine+2*wElenchi;
y = hEstratto+2.25f*margine+hEtElenchi;
wBordo = 0.00416f*kWFinPrinc>1 ? 0.00416f*kWFinPrinc : 1;
for( i=0; i<kTotPulsanti; y+=hPulsanti+margine, ++i ) {
g->pulsanti[i] = new PULSANTE(
x, y, wPulsanti, hPulsanti, kStrNomiPulsanti[i] );
g->pulsanti[i]->set_offscreen( g->os );
g->pulsanti[i]->set_dimensione_font( dimFontPuls, FALSE );
g->pulsanti[i]->set_spessore_bordo( wBordo, FALSE );
if( i==kPPEstrai ) {
g->pulsanti[i]->set_rettangolo(
x, kHFinPrinc-margine-1.50f*hPulsanti,
wPulsanti, 1.50f*hPulsanti );
g->pulsanti[i]->set_dimensione_font( 1.50f*dimFontPuls );
y -= hPulsanti+margine;
}
}
} catch( const char *err ) {
return kErrPulsantiNonCreati;
}
try { // crea il riquadro delle informazioni
x = 3*margine+2*wElenchi;
y = hEstratto+2.25f*margine+hEtElenchi+5*(hPulsanti+margine);
wBordo = 0;
g->riqInfo = new PULSANTE( x,y,wPulsanti,hInfo );
g->riqInfo->set_offscreen( g->os );
g->riqInfo->set_dimensione_font( dimFontEl, FALSE );
g->riqInfo->set_spessore_bordo( wBordo, FALSE );
g->riqInfo->set_allineamento_verticale( 1, FALSE );
g->riqInfo->set_allineamento_orizzontale( -1, FALSE );
g->riqInfo->set_titolo( ComponiStrInfo(), FALSE );
} catch( const char *err ) {
return kErrPulsantiNonCreati;
}
return kErrNessunErrore;
}
int CreaEstrazione( HWND hwnd, const char *dati ) {
GLOBALE *g = RicavaDatiGlobali( hwnd );
try {
g->e = new ESTRAZIONE( dati );
return kErrNessunErrore;
} catch( ... ) {
return kErrEstrazioneNonImpostata;
}
}
/// === FUNZIONE PER LA DISMISSIONE DELLE STRUTTURE EVENTUALMENTE ALLOCATE =====
// Chiamata appena prima che venga interrotta l'esecuzione del programma.
void DismettiTutto( GLOBALE *g ) {
int i;
delete g->e; g->e = NULL;
delete g->riqEstratto; g->riqEstratto = NULL;
for( i=0; i<kTotElenchi; ++i ) {
delete g->riqElenchi[i]; g->riqElenchi[i] = NULL;
delete g->riqEtElenchi[i]; g->riqEtElenchi[i] = NULL;
}
for( i=0; i<kTotPulsanti; ++i )
{ delete g->pulsanti[i]; g->pulsanti[i] = NULL; }
delete g->riqInfo; g->riqInfo = NULL;
delete g->os; g->os = NULL;
delete[] g->percorso_file; g->percorso_file = NULL;
// altre dismissioni da definire
DismettiGdiPlus();
}
/// === FUNZIONI RELATIVE ALLA PREDISPOSIZIONE DI GDI+, SE RICHIESTA ===========
static ULONG_PTR gdiplusToken = 0;
UINT InizializzaGdiPlus( void ) {
GdiplusStartupInput gdiplusStartupInput;
if( GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL ) != Ok )
return kErrGDIPlusNonInizializzato;
return kErrNessunErrore;
}
void DismettiGdiPlus( void ) {
GdiplusShutdown( gdiplusToken );
}