Condividi tramite


Classe CMDIChildWnd

Fornisce la funzionalità di una finestra figlio con interfaccia a documenti multipli (MDI) di Windows, insieme ai membri per gestire la finestra.

Sintassi

class CMDIChildWnd : public CFrameWnd

Membri

Costruttori pubblici

Nome Descrizione
CMDIChildWnd::CMDIChildWnd Costruisce un oggetto CMDIChildWnd.

Metodi pubblici

Nome Descrizione
CMDIChildWnd::Create Crea la finestra figlio MDI di Windows associata all'oggetto CMDIChildWnd .
CMDIChildWnd::GetMDIFrame Restituisce il frame MDI padre della finestra del client MDI.
CMDIChildWnd::MDIActivate Attiva questa finestra figlio MDI.
CMDIChildWnd::MDIDestroy Elimina questa finestra figlio MDI.
CMDIChildWnd::MDIMaximize Ingrandisce questa finestra figlio MDI.
CMDIChildWnd::MDIRestore Ripristina la finestra figlio MDI dalle dimensioni ingrandita o ridotta a icona.
CMDIChildWnd::SetHandles Imposta gli handle per le risorse di menu e acceleratore.

Osservazioni:

Una finestra figlio MDI è simile a una finestra cornice tipica, ad eccezione del fatto che la finestra figlio MDI viene visualizzata all'interno di una finestra cornice MDI anziché sul desktop. Una finestra figlio MDI non dispone di una barra dei menu personalizzata, ma condivide invece il menu della finestra cornice MDI. Il framework modifica automaticamente il menu cornice MDI per rappresentare la finestra figlio MDI attualmente attiva.

Per creare una finestra figlio MDI utile per l'applicazione, derivare una classe da CMDIChildWnd. Aggiungere variabili membro alla classe derivata per archiviare i dati specifici dell'applicazione. Implementare funzioni membro di gestione dei messaggi e una mappa messaggi nella classe derivata per specificare cosa succede quando i messaggi vengono indirizzati alla finestra.

Esistono tre modi per costruire una finestra figlio MDI:

  • Costruisci direttamente il file usando Create.

  • Costruisci direttamente il file usando LoadFrame.

  • Crearlo indirettamente tramite un modello di documento.

Prima di chiamare Create o LoadFrame, è necessario costruire l'oggetto finestra cornice nell'heap usando l'operatore C++ new . Prima di chiamare Create è anche possibile registrare una classe window con la funzione globale AfxRegisterWndClass per impostare gli stili di icona e classe per il frame.

Usare la Create funzione membro per passare i parametri di creazione del frame come argomenti immediati.

LoadFrame richiede meno argomenti di Createe recupera invece la maggior parte dei valori predefiniti dalle risorse, tra cui la didascalia, l'icona, la tabella dell'acceleratore e il menu. Per essere accessibile da LoadFrame, tutte queste risorse devono avere lo stesso ID risorsa, ad esempio IDR_MAINFRAME.

Quando un CMDIChildWnd oggetto contiene visualizzazioni e documenti, vengono creati indirettamente dal framework anziché direttamente dal programmatore. L'oggetto CDocTemplate orchestra la creazione del frame, la creazione delle visualizzazioni contenenti e la connessione delle visualizzazioni al documento appropriato. I parametri del CDocTemplate costruttore specificano le CRuntimeClass tre classi coinvolte (documento, cornice e visualizzazione). Un CRuntimeClass oggetto viene usato dal framework per creare dinamicamente nuovi frame quando viene specificato dall'utente, ad esempio usando il comando File Nuovo o il comando MDI Window New.

Una classe finestra cornice derivata da CMDIChildWnd deve essere dichiarata con DECLARE_DYNCREATE affinché il meccanismo di RUNTIME_CLASS precedente funzioni correttamente.

La CMDIChildWnd classe eredita gran parte dell'implementazione predefinita da CFrameWnd. Per un elenco dettagliato di queste funzionalità, vedere la descrizione della classe CFrameWnd . La CMDIChildWnd classe include le funzionalità aggiuntive seguenti:

  • Insieme alla CMultiDocTemplate classe, più CMDIChildWnd oggetti dello stesso modello di documento condividono lo stesso menu, salvando le risorse di sistema di Windows.

  • Il menu della finestra figlio MDI attualmente attiva sostituisce interamente il menu della finestra cornice MDI e la didascalia della finestra secondaria MDI attualmente attiva viene aggiunta alla didascalia della finestra cornice MDI. Per altri esempi di funzioni finestra figlio MDI implementate insieme a una finestra cornice MDI, vedere la descrizione della CMDIFrameWnd classe.

Non usare l'operatore C++ delete per eliminare definitivamente una finestra cornice. Utilizzare invece CWnd::DestroyWindow. L'implementazione CFrameWnd di PostNcDestroy eliminerà l'oggetto C++ quando la finestra viene eliminata definitivamente. Quando l'utente chiude la finestra cornice, il gestore predefinito OnClose chiamerà DestroyWindow.

Per altre informazioni su CMDIChildWnd, vedere Finestre cornice.

Gerarchia di ereditarietà

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIChildWnd

Requisiti

Intestazione: afxwin.h

CMDIChildWnd::CMDIChildWnd

Chiamare per costruire un CMDIChildWnd oggetto .

CMDIChildWnd();

Osservazioni:

Chiamare Create per creare la finestra visibile.

Esempio

Vedere l'esempio per CMDIChildWnd::Create.

CMDIChildWnd::Create

Chiamare questa funzione membro per creare una finestra figlio MDI di Windows e collegarla all'oggetto CMDIChildWnd .

virtual BOOL Create(
    LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName,
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
    const RECT& rect = rectDefault,
    CMDIFrameWnd* pParentWnd = NULL,
    CCreateContext* pContext = NULL);

Parametri

lpszClassName
Punta a una stringa di caratteri con terminazione Null che denomina la classe Windows (una struttura WNDCLASS ). Il nome della classe può essere qualsiasi nome registrato con la funzione globale AfxRegisterWndClass . Deve essere NULL per un oggetto standard CMDIChildWnd.

lpszWindowName
Punta a una stringa di caratteri con terminazione Null che rappresenta il nome della finestra. Usato come testo per la barra del titolo.

dwStyle
Specifica gli attributi dello stile della finestra. È necessario lo stile WS_CHILD.

rect
Contiene le dimensioni e la posizione della finestra. Il rectDefault valore consente a Windows di specificare le dimensioni e la posizione del nuovo CMDIChildWndoggetto .

pParentWnd
Specifica l'elemento padre della finestra. Se NULL, viene utilizzata la finestra principale dell'applicazione.

pContext
Specifica una struttura CCreateContext . Questo parametro può essere NULL.

Valore restituito

Diverso da zero se ha esito positivo; in caso contrario 0.

Osservazioni:

La finestra cornice figlio MDI attualmente attiva può determinare la didascalia della finestra cornice padre. Questa funzionalità è disabilitata disattivando il bit di stile FWS_ADDTOTITLE della finestra cornice figlio.

Il framework chiama questa funzione membro in risposta a un comando utente per creare una finestra figlio e il framework usa il parametro pContext per connettere correttamente la finestra figlio all'applicazione. Quando si chiama Create, pContext può essere NULL.

Esempio 1

Questo gestore dei comandi di menu di esempio richiama Create per creare una finestra figlio MDI:

// CMainFrame::OnFileNewCMdiChildWnd() is a menu command handler for the
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a standard Windows MDI child window using
// the registered CMDIChildWnd class.
void CMainFrame::OnFileNewMdiChildWnd()
{
   CMDIChildWnd *pMDIChildWnd = new CMDIChildWnd;
   VERIFY(pMDIChildWnd->Create(
       NULL,                                        // standard CMDIChildWnd class
       _T("My MDIChildWnd"),                        // caption of MDI child window
       WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, // window styles
       rectDefault,                                 // default rectangle size
       this));                                      // parent window; can be NULL

   // the default PostNcDestroy handler will delete this object when destroyed
}

Esempio 2

Il codice di esempio chiama il Create metodo di CHelloWnd, una classe derivata da CMDIChildWnd:

// CMainFrame::OnHello() is a menu command handler for the CMainFrame
// class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a Windows MDI child window using a custom
// window class. The custom window class is registered in
// CHelloWnd::Create(). CHelloWnd is a CMDIChildWnd-derived class.
void CMainFrame::OnHello()
{
   CHelloWnd *pHelloWnd = new CHelloWnd;
   if (!pHelloWnd->Create(_T("Hello"),
                          WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                          rectDefault, this))
      return;

   // the default PostNcDestroy handler will delete this object when destroyed
}

In questo esempio viene illustrata l'implementazione Create della CHelloWnd classe :

BOOL CHelloWnd::Create(
    LPCTSTR szTitle,
    LONG style /* = 0 */,
    const RECT &rect /* = rectDefault */,
    CMDIFrameWnd *parent /* = NULL */)
{
   // Setup the shared menu
   SetHandles(::LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_HELLO)),
              NULL);

   // Register a custom WndClass and create a window.
   // This must be done because CHelloWnd has a custom icon.
   LPCTSTR lpszHelloClass =
       AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
                           LoadCursor(NULL, IDC_ARROW),
                           (HBRUSH)(COLOR_WINDOW + 1),
                           LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_HELLO)));

   return CMDIChildWnd::Create(lpszHelloClass, szTitle, style, rect, parent);
}

CMDIChildWnd::GetMDIFrame

Chiamare questa funzione per restituire il frame padre MDI.

CMDIFrameWnd* GetMDIFrame();

Valore restituito

Puntatore alla finestra cornice padre MDI.

Osservazioni:

Il frame restituito è due elementi padre rimossi da CMDIChildWnd e è l'elemento padre della finestra di tipo MDICLIENT che gestisce l'oggetto CMDIChildWnd . Chiamare la funzione membro GetParent per restituire l'elemento CMDIChildWnd padre MDICLIENT immediato dell'oggetto come puntatore temporaneo CWnd .

Esempio

Vedere l'esempio per CMDIFrameWnd::MDISetMenu.

CMDIChildWnd::MDIActivate

Chiamare questa funzione membro per attivare una finestra figlio MDI indipendentemente dalla finestra cornice MDI.

void MDIActivate();

Osservazioni:

Quando il frame diventa attivo, verrà attivata anche la finestra figlio che è stata attivata per l'ultima volta.

Esempio

Vedere l'esempio per CMDIFrameWnd::GetWindowMenuPopup.

CMDIChildWnd::MDIDestroy

Chiamare questa funzione membro per eliminare definitivamente una finestra figlio MDI.

void MDIDestroy();

Osservazioni:

La funzione membro rimuove il titolo della finestra figlio dalla finestra cornice e disattiva la finestra figlio.

Esempio

// CMainFrame::OnCloseWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It closes and destroys the current active MDI child window.
void CMainFrame::OnCloseWindow()
{
   CMDIChildWnd *child = MDIGetActive();
   if (child)
      child->MDIDestroy();
}

CMDIChildWnd::MDIMaximize

Chiamare questa funzione membro per ingrandire una finestra figlio MDI.

void MDIMaximize();

Osservazioni:

Quando una finestra figlio è ingrandita, Windows lo ridimensiona in modo che l'area client riempia l'area client della finestra cornice. Windows posiziona il menu Di controllo della finestra figlio nella barra dei menu della cornice in modo che l'utente possa ripristinare o chiudere la finestra figlio e aggiunge il titolo della finestra figlio al titolo della finestra cornice.

Esempio

// CMainFrame::OnMaximizeWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It maximizes the current active MDI child window.
void CMainFrame::OnMaximizeWindow()
{
   BOOL maximized;
   CMDIChildWnd *child = MDIGetActive(&maximized);
   if (child && (!maximized))
      child->MDIMaximize(); // or MDIMaximize(child);
}

CMDIChildWnd::MDIRestore

Chiamare questa funzione membro per ripristinare una finestra figlio MDI dalle dimensioni ingrandita o ridotta a icona.

void MDIRestore();

Esempio

// CMainFrame::OnRestoreWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It restores the current active MDI child window from maximized
// or minimized size.
void CMainFrame::OnRestoreWindow()
{
   BOOL maximized;
   CMDIChildWnd *child = MDIGetActive(&maximized);
   if (child && (maximized || child->IsIconic()))
      child->MDIRestore(); // or MDIRestore(child);
}

CMDIChildWnd::SetHandles

Imposta gli handle per le risorse di menu e acceleratore.

void SetHandles(
    HMENU hMenu,
    HACCEL hAccel);

Parametri

hMenu
Handle di una risorsa di menu.

hAccel
Handle di una risorsa dell'acceleratore.

Osservazioni:

Chiamare questa funzione per impostare le risorse del menu e dell'acceleratore usate dall'oggetto finestra figlio MDI.

Vedi anche

MDI di esempio MFC
MdIDOCVW di esempio MFC
SNAPVW di esempio MFC
Classe CFrameWnd
Grafico della gerarchia
Classe CWnd
Classe CMDIFrameWnd