Condividi tramite


Esempio DYNAMENU: aggiornamento dinamico dei menu

Aggiornamento: novembre 2007

Nell'esempio DYNAMENU viene illustrata la modifica dinamica di menu e barre di stato, indipendentemente dal fatto che i comandi di gestione siano noti in fase di compilazione. In DYNAMENU vengono illustrate le seguenti funzionalità:

  • Aggiornamento dinamico dell'elenco di voci in un menu.

  • Implementazione dei gestori ON_COMMAND e ON_UPDATE_COMMAND_UI equivalenti per i comandi di menu i cui ID non sono noti in fase di compilazione. L'implementazione illustrata in questo esempio può essere applicata a casi più complessi, come i menu configurabili dall'utente.

  • Aggiornamento del prompt dei comandi della barra di stato per i comandi i cui ID non sono noti in fase di compilazione.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio DYNAMENU

  1. Aprire il file di soluzione dynamenu.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

In DYNAMENU inizialmente viene visualizzata una finestra con il testo: "This text is displayed in the current color". È possibile modificare il colore del testo visualizzato selezionando una delle quattro voci inizialmente presenti nel menu Color: Black, Red, Purple o Blue.

Per esercitarsi con la funzionalità di aggiornamento dinamico dei menu di DYNAMENU, scegliere Change Options dal menu Color per visualizzare la finestra di dialogo Change Color Options. Le caselle di controllo Black, Red, Purple e Blue consentono di scegliere i colori che si desidera rendere disponibili in modo dinamico nel menu Color. Se ad esempio si deseleziona Red e Purple, nel menu Color risulteranno disponibili solo le voci Black e Blue.

Si osservi che sulla barra di stato viene visualizzato, ad esempio, "Set current color text to Black" quando la voce Black del menu Color ha lo stato attivo.

Aggiornamento dinamico dell'elenco di voci in un menu

La classe CDynaMDIChildWnd in Mdichild.cpp implementa l'aggiornamento dinamico delle voci del menu Color. Quando l'elenco dei colori disponibili viene aggiornato oppure quando la finestra figlio MDI viene attivata, la funzione CDynaMDIChildWnd::RefreshColorMenu chiama CMenu::DeleteMenu per eliminare tutte le voci di colore presenti nel menu, quindi aggiunge i colori correntemente disponibili mediante CMenu::AppendMenu.

Implementazione di gestori comando per voci di menu dinamiche

DYNAMENU avrebbe potuto essere implementato riservando un elenco fisso di ID di comandi per i colori: ID_COLOR_BLACK, ID_COLOR_RED e così via. In tal caso, i gestori ON_COMMAND e ON_UPDATE_COMMAND_UI sarebbero stati implementati per i comandi dei colori nel modo consueto. Questa sarebbe stata la procedura più semplice per implementare DYNAMENU.

Tuttavia, a scopo illustrativo, in DYNAMENU non vengono utilizzati ID di comandi fissi. Vengono invece assegnati in modo dinamico ID di comandi non noti o associati alle voci di menu in fase di compilazione. L'implementazione illustrata in questo esempio può essere applicata a casi più complessi, come i menu configurabili dall'utente.

L'equivalente della gestione della mappa messaggi ON_COMMAND e ON_UPDATE_COMMAND viene implementato nell'override del documento di CCmdTarget::OnCmdMsg. Se la funzione OnCmdMsg viene chiamata con un puntatore NULL per il parametro AFX_CMDHANDLERINFO*, per il comando non è stata trovata alcuna voce di mappa messaggi. In questo caso, con l'override di OnCmdMsg viene controllato se l'ID di comando, passato come primo parametro, costituisce uno degli ID di comando assegnati in modo dinamico per le voci di menu dei colori. Se la verifica ha esito positivo, mediante l'override viene chiamato un gestore comando (DoSelectColor) oppure un gestore interfaccia utente comandi (DoUpdateSelectColor), a seconda che il secondo parametro passato a OnCmdMsg corrisponda a un CN_UPDATE_COMMAND_UI o a un CN_COMMAND definito da MFC.

Aggiornamento del prompt dei comandi della barra di stato per voci di menu dinamiche

In DYNAMENU, la finestra figlio MDI CDynaMDIChildWnd contiene la barra di stato. Nell'implementazione predefinita di CFrameWnd::GetMessageString viene utilizzato l'ID di comando correntemente visualizzato, corrispondente alla voce di menu con lo stato attivo, per ottenere la corrispondente risorsa di tipo stringa per il comando e visualizzarla nel primo riquadro della barra di stato. In DYNAMENU viene eseguito l'override di GetMessageString per visualizzare un prompt dei comandi per i comandi definiti in modo dinamico.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

AfxFormatString1; AfxGetMainWnd; CCmdTarget::OnCmdMsg; CDialog::DoModal; CDialog::OnInitDialog; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::GetActiveDocument; CFrameWnd::GetMessageString; CFrameWnd::LoadFrame; CMenu::AppendMenu; CMenu::DeleteMenu; CMenu::GetMenuItemCount; CMenu::GetMenuItemID; CMenu::GetSubMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnDraw; CView::OnEndPrinting; CView::OnPreparePrinting; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::CenterWindow; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetMenu; CWnd::GetParentFrame; CWnd::OnCreate; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; DrawText; LoadBitmap; RGB; SetBkMode; SetTextColor

Nota:

Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata.

Vedere anche

Altre risorse

Esempi relativi ad MFC