Nella scorsa puntata abbiamo esaminato le proprietà principali
dei menu: ID, Caption e Prompt.
Le proprietà secondarie utili dei menu invece sono Grayed,
Inactive, Checked, Pop-up, e Separator.
La prima della lista rende grigia una voce e quindi non cliccabile,
la seconda la rende comunque non cliccabile, ma la lascia del colore
originario. Checked aggiunge un segno di spunta alla voce,
Pup-up inserisce la freccina verso destra per consentire
di inserire un sottomenu e Separator inserisce una linea
di divisione orizzontale.
Per esercitarci creiamo una voce nel menu Visualizza e chiamiamola
ProvaMenu, mettiamo come suo ID: ID_VIEW_PROVAMENU.
A questo punto siamo ormai esperti su come si crea graficamente
un menu, ora bisogna collegarlo alle funzioni della nostra applicazione:
niente di più facile,no?
Basta selezionare la voce nell'editor di risorse e con il tasto
destro del mouse cliccare sulla voce ClassWizard. Qui vedremo
l'identificatore della nostra voce nel riquadro di sinistra e a
destra le due voci COMMAND e UPDATE_COMMAND_UI. Se facciamo doppio
clic su COMMAND il Wizard ci chiederà il nome della funzione che
dovrà essere richiamata quando si seleziona quella voce di menu.
Facendo invece doppio clic su UPDATE_COMMAND_UI il Wizard ci chiederà
il nome della funzione che deve sincronizzare lo stato di quella
voce di menu con lo stato dell'applicazione (questo lo vedremo in
seguito).
Proviamo a seguire questo procedimento per la voce ProvaMenu
che abbiamo aggiunto noi. Una volta che abbiamo fatto doppio clic
su COMMAND, il Wizard ci propone come nome di funzione OnViewProvamenu,
noi confermiamo e poi facciamo doppio clic su questo nome di funzione
che è stato aggiunto in basso; in questo modo scompare la finestra
del Wizard e ci troviamo con il codice della nostra funzione davanti.
Per scegliere in quale classe inserire la funzione (di default CMainFrame),
basta che nel Wizard, come ben sappiamo, scegliamo la classe giusta
dalla casella a discesa ClassName in alto a destra.
Nella nostra funzione OnViewProvamenu, inserite il seguente
codice:
AfxMessageBox("Ciao Software Planet!");
Con questa riga di codice si fa si che appaia sullo schermo una
finestrella (una finestra di messaggio detta MessageBox) con dentro
la stringa da noi specificata.
Se non riuscite a trovare più la funzione perché magari nel frattempo
ve ne siete andati gironzolando tra le finestre del VC++, selezionate
ClassView (la prima scheda sulla destra), quindi la classe
CMainFrame e tra le funzioni di queste troverete anche la
vostra pecorella smarrita.
Ora compilate tutto e vedete cosa succede.
Non abbiamo fatto molto, oltre che parlare di tanti aspetti dei
menu; il loro uso vero e proprio richiede di fare solo 3 o 4 click
qua e la. Però della teoria di base è sempre importante, ci permetterà
in futuro di capire meglio il S.O. e di sapere dove cercare gli
errori apparentemente inspiegabili.
Se siete daccordo continuiamo ad approfondire largomento,
se non lo siete, lo facciamo comunque! (smile)
Quando un utente clicca su una voce di menu superiore, Windows genera
una grande quantità di messaggi; a noi solitamente questi non interessano
visto che servono per implementare comportamenti gestiti automaticamente
dal sistema operativo. Questi potrebbero servire però ai più smaliziati
quando più in la vorranno creare voci di menu personalizzate con
bitmap, suoni e tutto quanto si desideri.
Tra i primi messaggi che arrivano (oltre a quello di clic del mouse
o di tasto premuto della tastiera) cè WM_INITMENU. Questo
messaggio notifica che è stata selezionata una voce e che sta per
essere visualizzato un menu. Prima che questo appaia sullo schermo
arriva un messaggio WM_INITMENUPOPUP.
Ricordo che i menu a discesa sono sempre e comunque dei menu popup,
con lunica differenza che la loro origine è predefinita ed
è dipendente dalla posizione della voce di menu cliccata.
I vecchi (smile) programmatori in C erano soliti agganciare questo
messaggio per impostare lo stato delle voci di menu e sincronizzarle
con lo stato dellapplicazione (spuntavano, abilitavano e disabilitavano
voci). Oggi ciò è fatto in un modo molto più semplice grazie ad
MFC e allinfrastruttura del FrameWork di applicazione.
Clicca sull'icona del floppy per scaricare il progetto Prg36. ![]()
Clicca sull'icona del floppy per scaricare direttamente l'eseguibile
Prg36.exe ![]()
Per oggi può bastare con la teoria, avete molto da sperimentare
con tutto quanto esposto; spero di trovarvi preparati per la prossima
lezione, ahimè, ancora teorica.
Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet