Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
Nell'esempio DLGCBR32 viene illustrato come aggiungere una barra di stato e una barra degli strumenti a una finestra di dialogo. Inoltre, vengono dimostrate diverse tecniche relative all'utilizzo di una finestra di dialogo non modale come finestra principale di un'applicazione MFC.
In un'applicazione MFC, è possibile inserire barre di controllo, come barre di stato e barre degli strumenti, in una finestra cornice. Tuttavia, per molte applicazioni è sufficiente una semplice interfaccia utente a finestre. In MFC non è disponibile il supporto incorporato per l'aggiunta di barre di controllo alle finestre di dialogo.
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 DLGCBR32
Aprire il file di soluzione Dlgcbr32.sln.
Scegliere Genera dal menu Genera.
Scegliere Avvia senza eseguire debug dal menu Debug.
Aggiunta di una barra di controllo a una finestra di dialogo
Per aggiungere una barra di controllo a una finestra di dialogo, creare la barra di controllo nel modo consueto e creare lo spazio per la barra all'interno dell'area client della finestra di dialogo. Per consentire un corretto funzionamento della barra di controllo, la finestra di dialogo deve duplicare alcune funzionalità di una finestra cornice. Se si desidera che i gestori ON_UPDATE_COMMAND_UI eseguano operazioni per le barre di controllo, è necessario derivare nuove classi di barre di controllo e gestire il messaggio WM_IDLEUPDATECMDUI. Se la finestra di dialogo non è la finestra principale dell'applicazione, sarà necessario modificare la finestra cornice padre per passare il messaggio WM_IDLEUPDATECMDUI alle barre di controllo della finestra di dialogo.
Per creare spazio per una barra di controllo all'interno dell'area client della finestra di dialogo, eseguire le istruzioni riportate di seguito nella funzione OnInitDialog della finestra di dialogo:
Creare le barre di controllo. Stabilire lo spazio che verrà utilizzato dalle barre di controllo utilizzando l'opzione reposQuery di RepositionBars.
CRect rcClientStart; CRect rcClientNow; GetClientRect(rcClientStart); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);Spostare i controlli nella finestra di dialogo per creare lo spazio necessario alle barre di controllo nella parte superiore o sinistra dell'area client. Se la finestra di dialogo contiene un menu, è necessario tenere in considerazione anche lo spazio necessario per il menu.
CPoint ptOffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top); CRect rcChild; CWnd* pwndChild = GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild, FALSE); pwndChild = pwndChild->GetNextWindow(); }Aumentare le dimensioni della finestra di dialogo in base alla quantità di spazio utilizzato dalle barre di controllo.
CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right += rcClientStart.Width() - rcClientNow.Width(); rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height(); MoveWindow(rcWindow, FALSE);Posizionare le barre di controllo utilizzando RepositionBars.
Per aggiornare il primo riquadro di una barra di stato con il testo associato a una voce di menu, è necessario gestire WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRING e WM_POPMESSAGESTRING nella classe di finestre di dialogo. Per questi messaggi è necessario duplicare le funzionalità dei gestori CFrameWnd. Per esempi relativi ai gestori di questo tipo di messaggi, vedere la classe CModelessMain nel programma di esempio.
Per visualizzare la descrizione comandi per i pulsanti della barra degli strumenti, è necessario gestire le notifiche TTN_NEEDTEXTW e TTN_NEEDTEXTA.
Per consentire ai gestori ON_UPDATE_COMMAND_UI di eseguire operazioni per altri riquadri della barra di stato e per i pulsanti della barra degli strumenti, è necessario derivare nuove classi di barre di controllo e implementare un gestore messaggi per WM_IDLEUPDATECMDUI. Queste operazioni sono necessarie perché nelle implementazioni predefinite delle barre di controllo di OnUpdateCmdUI si presume che la finestra padre sia una finestra cornice. OnUpdateCmdUI, tuttavia, si limita a passare il puntatore della finestra padre a una funzione che richiede solo un puntatore CCmdTarget. Pertanto, è possibile comunicare temporaneamente a OnUpdateCmdUI che il puntatore della finestra padre fornito è un puntatore CFrameWnd che soddisfa i requisiti del compilatore. Esempio:
LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
if (IsWindowVisible())
{
CFrameWnd* pParent = (CFrameWnd*)GetParent();
if (pParent)
OnUpdateCmdUI(pParent, (BOOL)wParam);
}
return OL;
}
Per passare i messaggi WM_IDLEUPDATECMDUI a finestre di dialogo diverse dalla finestra principale, salvare i puntatori delle finestre di dialogo nella classe di finestre cornice e creare un gestore WM_IDLEUPDATECMDUI nella classe stessa. Il gestore invierà il messaggio WM_IDLEUPDATECMDUI alle finestre di dialogo figlio utilizzando CWnd::SendMessageToDescendants. Quindi eseguirà l'elaborazione predefinita del messaggio all'interno della finestra cornice.
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. |
Nota sulla sicurezza:
Nota: