Newsgroup: it.comp.programmare.win32
Titolo: GUI

Sono un programmatore C++ alle prime armi.
Volendo cominciare a dare un'interfaccia grafica ai miei programmi, mi
consigliate di studiare le Winapi da zero, oppure di usare le MFC o le
Windows Forms .NET o cosa?
Quali sono i vantaggi e gli svantaggi di usare l'uno o l'altro metodo?
In definitiva come mi consigliate di cominciare?
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 In definitiva come mi consigliate di cominciare?
Programmare in C++ e MFC non e' un esperienza piacevole, ma se il tuo
obbiettivo e' imparare a fare applicazioni con una GUI sotto windows
conviene darci un occhiata, almeno per scrupolo.
Se vuoi usare le Win Forms e .NET conviene che salti il fosso impari C#.
E' abbastanza diverso da C++, ma e' solo questione di pratica. Usare
le classi .NET da C++ non e' molto pratico. Se conosci il C++, anche non
molto bene, imparare C# e' questione di una settimana o due.
Guardando al futuro, visto che .NET sara' sempre piu' usato (specialmente
dal prossimo SO di Microsoft) il C# e Win Forms e' meglio impararlo.
(Considerando che il framework .NET e' presente anche sotto
Linux/MacOS/*BSD col progetto Mono, direi che C# e' la scelta piu'
saggia).
Ciao.


Il C# inoltre e' piu' semplice del C++, anche nel senso che e' piu' 
difficile commettere errori con C# rispetto a C++ (es.: molti errori del 
C++ riguardano la cattiva gestione dei puntatori; con C# non avresti di 
questi problemi... anche se in C++ esistono classi per gli "smart 
pointer"...).
Gli svantaggi di C# + .NET riguardano le minori performance e maggiore 
occupazione di memoria rispetto all'uso di C++ e API native o MFC.
Se non sbaglio, su questo stesso newsgroup, in un post si diceva che una 
semplice finestra "Hello World" in C# + .NET occupa 10MB di RAM...!! :)
(OK che adesso c'e' in giro hardware molto potente, pero' esiste ancora 
installato hardware piu' "obsoleto", e inoltre a me gli exe ciccioni e 
lo spreco di risorse non piacciono... sono per la "vecchia scuola" ! :-)
Inoltre con C# potrebbe essere piu' facile decompilare il tuo programma,  
da quello che so esistono dei de-compilatori C#, come ne esistono per 
Java. ...pare sia un problema di questi linguaggi che compilano in 
pseudo-codice.
Ritornando al discorso C++ "puro", rimane il bivio API native vs MFC.
Secondo me, l'approccio migliore sarebbe quello di imparare prima i 
rudimenti della API del Win32 SDK: cose come registrare una classe di 
finestra, creare una finestra,  window-procedure, message-loop, invio di 
messaggi a controlli, etc. ti dovrebbero essere chiare a livello di 
Win23 SDK.
*Poi*, quando ti impadronisci bene di questi concetti, puoi passare ad 
MFC. Troverai tante comode classi e tanto utile codice gia' scritto e 
testato dai programmatori di Redmond, il tutto in una forma object-
oriented, molto comodo per lo sviluppo.
Pero', secondo me, andare subito con MFC, senza sapere i rudimenti del 
Win32 SDK, non sarebbe molto saggio: ti mancherebbero dei "mattoni" 
concettuali, che potrebbero essere importanti in fase di debug, o per 
realizzare cose avanzate, o anche per capire cosa va storto in certe 
situazioni.
Inoltre, esistono alcuni aspetti del Win32 SDK che MFC non copre con le 
sue classi; in questo caso interfacciarti col Win32 SDK diventa 
obbligatorio (tra l'altro, le MFC sono state progettate in maniera tale 
che l'interfacciamento col Win32 SDK risulta abbastanza comodo).
Insomma, secondo me MFC e' un po' come una calcolatrice, e Win32 SDK e' 
la "matematica"; prima impari cosa sono radici quadrate, seni e coseni, 
e poi usi la calcolatrice per calcolarli e sbrigarti prima. Ma la base 
teorica ci vuole!
E' bene puntualizzare che e' tutto IMHO, ed e' inoltre il parere di un 
hobbysta appassionato, e non di un professionista.
Spero ti sia utile.
Ciao, e buona programmazione!
Dan

 Spero ti sia utile.

grazie per la risposta
credo allora che mi darò alle Win32Api + C++, dal momento che per fare
qualsiasi cosa (anche videogiochi) pare essere necessaria una base di
programmazione win32.
Poi a quanto ho capito una volta imparato C++ non farò fatica ad imparare
anche C# per applicazioni "meno esigenti".
Dico bene?


 Quali sono i vantaggi e gli svantaggi di usare l'uno o l'altro metodo?
Sicuramente, gestire una window a (relativo) basso livello con le API è 
una esperienza traumatica per un novizio. Però questa è l'architettura 
anche se si usano classi che la astraggono in parte o in tutto.
Una volta acquisita l'architettura di base, ci si rende conto quando è 
utile usare le MFC e quando non conviene; il framework MFC riduce 
considerevolmente i tempi di sviluppo a scapito della flessibilità.

 Dico bene?
Dici bene.
Se hai voglia dai un occhio al mini framework che ho scritto (vedi
signature), incapsula in un layer leggerissimo le API di Windows. Ti può
essere utile anche sbirciare il codice per vedere come si creano diverse
cose (l'uso dei tooltip, l'api OleLoadPicture, etc.).
Ciao
Stefano "HappyMan" (Lake Maggiore - Italy)
PS. 
Dai un occhio anche alle regole del quoting :-)
-- 
The Personal Framework for Object Oriented Windows Development (Win32)
http://www.sgr.info
Email happyman69 (at) 
despammed.com

 Dico bene?
Secondo me dici benissimo! :)
Ciao!
Dan

 signature), incapsula in un layer leggerissimo le API di Windows. 
Confermo e mi associo al consiglio: si tratta di un ottimo framework!
Non avrai tutta la "potenza" di MFC (es.: per il discorso OLE Automation 
o OLE Control, etc.), pero' e' decisamente piu' leggero delle MFC, oltre 
che ben comodo da usare, e "pulito".
Ciao,
Dan

Sembra un lavoro molto ben fatto, ma ad essere sincero sono partito da
zero con windows.h, non lo trovo molto difficile: registro una classe
finestra, predispondo il loop dei messaggi e mi programmo la procedura.
Bisogna più che altro stare attenti ai tipi (quei buontemponi della
microsoft si divertono un mondo con #define :P).
Comunque appena avrò capito i meccanismi base sicuramente darò un'occhiata
al tuo framework (l'ho già scaricato), soprattutto è utile per vedere che
soluzioni hai adottato per "semplificare" il tutto.
Ciao!


Mi sto trovando abbastanza bene con le api.
Per curiosità mi sono fatto dire il codice per creare una finestra in Java:
Frame f = new Frame("Nome Finestra");
f.setSize(300,300);
f.setVisible(true);
Niente in confronto alle decine di codice composte da registrazione, loop
e procedura!
Certo, il C++ produrrà eseguibili più ottimizzati, ma per quanto riguarda
la risoluzione di problemi, scopo della programmazione, ogni problema che
si può risolvere con C++ credo si possa risolvere con Java.
Penso che per alcune semplici applicazioni quindi sia vantaggioso usare
linguaggi a livello più alto.
Anche se già facendomi una libreria potrei velocizzare il lavoro nella
semplice creazione di finestre.


 Ciao!
Dopo aver appreso bene i concetti del C++ ho trovato che l'aspetto più
"distante" dall'approccio ad oggetti durante la programmazione con le API è
legato al fatto che tutti i controlli comunicano i loro eventi (messaggi)
tramite il WM_COMMAND della finestra parent, per cui il concetto di
incapsulamento va a farsi benedire :-)
Il primo passo che qualunque framework deve fare (e che ho fatto anch'io
ovviamente) è fare in modo che ogni controllo generi i propri eventi e
abbia le sue proprietà (per esempio se devi cambiare il colore di un
controllo devi agire sul messaggio WM_CTLCOLOR e famiglia sempre
all'interno della parent window).
Nel mio caso ho creato una classe il cui puntatore è memorizzato tramite la
GetWindowLong, all'interno delle window procedure tramite subclassing
richiamo i vari metodi e uso le varie proprietà degli oggetti, il tutto
condito con una spruzzata di ereditarietà...
Ciao e buono studio !
Stefano "HappyMan" (Lake Maggiore - Italy)


 linguaggi a livello più alto.
Guarda, se e' per questo - dal mio punto di vista - per semplici tool, 
Visual Basic 6 (non quello piu' nuovo, che mi pare piu' complicato) e' 
un ottimo strumento! 
...certo, per un'applicazione di calcolo scientifico, un videogame 
all'ultimo grido, o altra roba avanzata non e' adatto.
Come al solito, non e' che esista un linguaggio migliore in assoluto: 
per ogni problema, c'e' un insieme di linguaggi piu' adatti di altri.
...poi uno e' anche libero di programmare sotto Windows in assembly!
:)
Ciao,
Dan

 Programmare in C++ e MFC non e' un esperienza piacevole
Si, confermo, per gli incapaci. :/ 
-- 
Luc


Coraggio, se ti impegni ci riesci anche tu..
;-)

 ;-)
AfxMessageBox("ROTFL"); 
-- 
Luc

MessageBox( hWnd, "ROTFL", "NO MFC", MB_ICONEXCLAMATION);
:-)))))))))))))))))))

 MessageBox( hWnd, "ROTFL", "NO MFC", MB_ICONEXCLAMATION);
Vedi che con MFC è più semplice del tuo? :-P 
-- 
Luc

 
Giusto per confonderti un po' di più, aggiungo un paio di alternative:
- WTL (IMHO meglio delle MFC), le puoi scaricare dal sito microsoft
- una delle librerie portabili (vxWindows, QT etc.)
La scelta dipende da che tipo di programmi devi realizzare.
Personalmente ritengo le WTL più leggere e flessibili di MFC, mentre 
ritengo indicato l'uso delle librerie portatili solo se la portabilità 
è requisito fondamentale delle applicazioni che andrai a realizzare. 
Una GUI per windows (o per mac, o per linux) realizzata con una 
libreria portabile e senza trucchi o ottimizzazioni legate a uno 
specifico S.O. (che comprometterebbero la portabilità) non funzionerà 
mai bene come un'applicazione nativa.
Comunque, prima di iniziare a usare le librerie, ti consiglio di 
sperimentare un po' con le API "nude e crude". Ti aiuterà a prendere 
confidenza con i meccanismi base (loop dei messaggi, handle vari etc.) 
che generalmente vengono nascosti dalle librerie, ma rischiano di 
saltar fuori quando ti troverai a dover risolvere dei problemi.
-- 
Valter Minute
vmi...@inwind.it
 (the reply address of this message is invalid)

Luc ha scritto:


throw CMiStoLollandoTroppoException;
