Corso di Visual C++

Creare menu a runtime

 

Abbiamo visto nelle ultime puntate come rimuovere e modificare una voce e come eliminare un popup, vediamo ora come sia possibile aggiungere nuove voci e menu popup.
Aggiungiamo ad esempio un menu popup che permette di scegliere gli spessori di linea. Il menu si chiama Spessore ed è inserito prima della voce dell'help ?. Per creare questo menu a runtime aggiungiamo nel menu Visualizza la voce CreaVociSpessore e quindi colleghiamola al codice.

Se non abbiamo già un menu di livello superiore, ne dovremo creare uno ex-novo e quindi appendere a questo i vari menu popup.
Per creare un menu principale occorre usare la funzione CreateMenu, mentre per creare un popup occorre usare CreatePopupMenu. Una volta avuti questi elementi le voci si aggiungono con AppendMenu o InsertMenu. La differenza è che la seconda funzione inserisce la voce alla posizione specificata, eventualmente scalando di posizione le altre voci, mentre la prima aggiunge la voce in coda alle altre alla fine del menu
Queste due funzioni permettono sia di attaccare un popup ad un menu principale, che attaccare una voce ad un popup.

Per prima cosa quindi occorre recuperare il puntatore al menu principale (il caso del nostro esempio):

CMenu *pMainMenu;
pMainMenu=GetMenu();

Se invece il menu principale non esiste, lo dobbiamo creare:

CMenu *pMainMenu = new CMainMenu;
pMainMenu->CreateMenu();


Invece di usare un puntatore, il menu potevamo anche crearlo sullo stack:

CMenu mainMenu;
mainMenu.Createmenu;


I due metodi sono funzionalmente equivalenti, l'unica differenza è nell'accesso alle funzioni membro e al fatto che allocando il menu sull'heap (in modo dinamico con new) all'uscita della funzione dobbiamo preoccuparci di liberare la memoria.

Recuperato quindi il puntatore al menu principale occorre successivamente creare il menu popup da inserire al suo interno:

void CMainFrame::OnVisualizzaCreavocispessore()
{
            CMenu *pMainMenu = GetMenu();
           
            CMenu menuPopup;
            menuPopup.CreatePopupMenu();
            menuPopup.AppendMenu (MF_STRING, ID_SPESSOREGRANDE, "&Molto spesso\t");
            menuPopup.AppendMenu (MF_STRING, ID_SPESSOREPICCOLO, "&Poco spesso\t");

            pMainMenu->InsertMenu(4,MF_POPUP | MF_BYPOSITION, (UINT) menuPopup.Detach(), "&Spessore");

                       
            DrawMenuBar();
           
}


In questa funzione abbiamo usato per la prima volta InsertMenu, questa è simile ad AppendMenu, ma come detto fa scegliere la posizione in cui inserire la voce.

Se provate a compilare e ad eseguire, avrete un errore, infatti gli identificatori usati non sono stati dichiarati. Per fare ciò usate il ResourceSymbols ed aggiungete ID_SPESSOREGRANDE e ID_SPESSOREPICCOLO.
Ora non avrete più alcun errore, ma le voci resteranno in grigio se non le collegate ad alcuna funzione.

Qui di seguito ci sono  anche un altro paio di funzioni membro di CMenu che potrebbero risultarvi utili:

GetMenuItemCount:  restituisce il numero di voci del menu.
GetMenuItemID: restituisce l’identificatore numerico della voce di menu specificata tramite la posizione.
GetMenuState: tramite dei bit ritorna lo stato di una voce (abilitato,spuntato…)
GetMenuString: restituisce il testo di una voce di menu.

CheckMenuItem:  aggiunge o elimina il segno di spunta da una voce.
EnableMenuItem: abilita o disabilita una voce di menu.
SetMenuItemBitmaps: permette di specificare le bitmap che vengono utilizzate per spuntare le voci di menu.


Nella prossima puntata parleremo dell’ultimo aspetto riguardante i menu: i menu di contesto.

 

Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet