Condividi tramite


Classe CMDIFrameWnd

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

Sintassi

class CMDIFrameWnd : public CFrameWnd

Membri

Costruttori pubblici

Nome Descrizione
CMDIFrameWnd::CMDIFrameWnd Costruisce un oggetto CMDIFrameWnd.

Metodi pubblici

Nome Descrizione
CMDIFrameWnd::CreateClient Crea una finestra MDICLIENT di Windows per questo CMDIFrameWndoggetto . Chiamato dalla OnCreate funzione membro di CWnd.
CMDIFrameWnd::CreateNewChild Crea una nuova finestra figlio.
CMDIFrameWnd::GetWindowMenuPopup Restituisce il menu a comparsa Finestra.
CMDIFrameWnd::MDIActivate Attiva una finestra figlio MDI diversa.
CMDIFrameWnd::MDICascade Dispone tutte le finestre figlio in un formato a catena.
CMDIFrameWnd::MDIGetActive Recupera la finestra figlio MDI attualmente attiva, insieme a un flag che indica se l'elemento figlio è ingrandito o meno.
CMDIFrameWnd::MDIIconArrange Dispone tutte le finestre figlio del documento ridotte a icona.
CMDIFrameWnd::MDIMaximize Ingrandisce una finestra figlio MDI.
CMDIFrameWnd::MDINext Attiva la finestra figlio immediatamente dietro la finestra figlio attualmente attiva e posiziona la finestra figlio attualmente attiva dietro tutte le altre finestre figlio.
CMDIFrameWnd::MDIPrev Attiva la finestra figlio precedente e posiziona la finestra figlio attualmente attiva immediatamente dietro di essa.
CMDIFrameWnd::MDIRestore Ripristina una finestra figlio MDI dalle dimensioni ingrandita o ridotta a icona.
CMDIFrameWnd::MDISetMenu Sostituisce il menu di una finestra cornice MDI, il menu a comparsa Finestra o entrambi.
CMDIFrameWnd::MDITile Dispone tutte le finestre figlio in un formato affiancato.

Osservazioni:

Per creare una finestra cornice MDI utile per l'applicazione, derivare una classe da CMDIFrameWnd. 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.

È possibile costruire una finestra cornice MDI chiamando la funzione membro Create o LoadFrame di CFrameWnd.

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.

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

Anche se MDIFrameWnd è derivato da CFrameWnd, non è necessario dichiarare una classe finestra cornice derivata da CMDIFrameWnd con DECLARE_DYNCREATE.

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

  • Una finestra cornice MDI gestisce la finestra MDICLIENT, riposizionandola insieme alle barre di controllo. La finestra del client MDI è l'elemento padre diretto delle finestre cornice figlio MDI. Gli stili di finestra WS_HSCROLL e WS_VSCROLL specificati in un CMDIFrameWnd oggetto si applicano alla finestra del client MDI anziché alla finestra cornice principale in modo che l'utente possa scorrere l'area client MDI (ad esempio, come in Windows Program Manager).

  • Una finestra cornice MDI è proprietaria di un menu predefinito usato come barra dei menu quando non è presente alcuna finestra figlio MDI attiva. Quando è presente un figlio MDI attivo, la barra dei menu della finestra cornice MDI viene sostituita automaticamente dal menu della finestra figlio MDI.

  • Una finestra cornice MDI funziona insieme alla finestra figlio MDI corrente, se presente. Ad esempio, i messaggi di comando vengono delegati al figlio MDI attualmente attivo prima della finestra cornice MDI.

  • Una finestra cornice MDI include gestori predefiniti per i comandi di menu finestra standard seguenti:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Una finestra cornice MDI include anche un'implementazione di ID_WINDOW_NEW, che crea una nuova cornice e una visualizzazione nel documento corrente. Un'applicazione può eseguire l'override di queste implementazioni predefinite dei comandi per personalizzare la gestione delle finestre MDI.

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 CMDIFrameWnd, vedere Finestre cornice.

Gerarchia di ereditarietà

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

Requisiti

Intestazione: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

Costruisce un oggetto CMDIFrameWnd.

CMDIFrameWnd();

Osservazioni:

Chiamare la Create funzione membro o LoadFrame per creare la finestra cornice MDI visibile.

Esempio

// Create main MDI Frame window. CMainFrame is a CMDIFrameWnd-derived
// class. The default CFrameWnd::PostNcDestroy() handler will delete this
// object when destroyed.
CMainFrame *pMainFrame = new CMainFrame;

CMDIFrameWnd::CreateClient

Crea la finestra client MDI che gestisce gli CMDIChildWnd oggetti.

virtual BOOL CreateClient(
    LPCREATESTRUCT lpCreateStruct,
    CMenu* pWindowMenu);

Parametri

lpCreateStruct
Puntatore lungo a una struttura CREATESTRUCT .

pWindowMenu
Puntatore al menu a comparsa Finestra.

Valore restituito

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

Osservazioni:

Questa funzione membro deve essere chiamata se si esegue direttamente l'override della OnCreate funzione membro.

Esempio

// The code below is from winmdi.cpp. It shows how to
// call CMDIFrameWnd::CreateClient(). CMainFrame is a
// CMDIFrameWnd-derived class.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext * /*pContext*/)
{
   CMenu *pMenu = NULL;
   if (m_hMenuDefault == NULL)
   {
      // default implementation for MFC V1 backward compatibility
      pMenu = GetMenu();
      ASSERT(pMenu != NULL);
      // This is attempting to guess which sub-menu is the Window menu.
      // The Windows user interface guidelines say that the right-most
      // menu on the menu bar should be Help and Window should be one
      // to the left of that.
      int iMenu = pMenu->GetMenuItemCount() - 2;

      // If this assertion fails, your menu bar does not follow the guidelines
      // so you will have to override this function and call CreateClient
      // appropriately or use the MFC V2 MDI functionality.
      ASSERT(iMenu >= 0);
      pMenu = pMenu->GetSubMenu(iMenu);
      ASSERT(pMenu != NULL);
   }

   return CreateClient(lpcs, pMenu);
}

CMDIFrameWnd::CreateNewChild

Crea una nuova finestra figlio.

CMDIChildWnd* CreateNewChild(
    CRuntimeClass* pClass,
    UINT nResource,
    HMENU hMenu = NULL,
    HACCEL hAccel = NULL);

Parametri

pClass
Classe di runtime della finestra figlio da creare.

nResource
ID delle risorse condivise associate alla finestra figlio.

Hmenu
Menu della finestra figlio.

hAccel
Acceleratore della finestra figlio.

Osservazioni:

Usare questa funzione per creare finestre figlio di una finestra cornice MDI.

Esempio

// CMainFrame is a CMDIFrameWnd-derived class,
// OnNewDraw is a menu command handler,
// CDrawFrame is a CMDIChildWnd-derived class.
void CMainFrame::OnNewDraw()
{
   CreateNewChild(RUNTIME_CLASS(CDrawFrame), IDR_DRAW, m_hDrawMenu,
                  m_hDrawAccel);
}

CMDIFrameWnd::GetWindowMenuPopup

Chiamare questa funzione membro per ottenere un handle al menu a comparsa corrente denominato "Window" (menu a comparsa con voci di menu per la gestione delle finestre MDI).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Parametri

hMenuBar
Barra dei menu corrente.

Valore restituito

Menu a comparsa Finestra, se presente; in caso contrario NULL.

Osservazioni:

L'implementazione predefinita cerca un menu a comparsa contenente i comandi di menu standard della finestra, ad esempio ID_WINDOW_NEW e ID_WINDOW_TILE_HORZ.

Eseguire l'override di questa funzione membro se si dispone di un menu Finestra che non usa gli ID dei comandi di menu standard.

Esempio

// CMainFrame::OnActivateFirstMDIChild() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It looks for the caption of the first created MDI child window from
// the Window popup menu, and then activate the child window.
void CMainFrame::OnActivateFirstMDIChild()
{
   // Get handle to the Window pop-up menu.
   CMenu *menubar = GetMenu();
   CMenu *wmenu = CMenu::FromHandle(GetWindowMenuPopup(menubar->GetSafeHmenu()));
   if (wmenu == NULL)
      return;

   // Get the caption of the first created MDI child window.
   CString caption;
   if (!wmenu->GetMenuString(AFX_IDM_FIRST_MDICHILD, caption, MF_BYCOMMAND))
      return;

   // Get the actual name of the first created MDI child window by
   // getting rid of the number and space, e.g. "&1 MDI 1".
   int pos = caption.FindOneOf(_T(" "));
   if (pos == -1)
      return;

   caption = caption.Right(caption.GetLength() - (pos + 1));

   // Get the CWnd* of the first created MDI child window by comparing
   // the caption of each MDI child window in the MDI application.
   // Activate the first created MDI child window if found.
   CMDIChildWnd *child = MDIGetActive();
   do
   {
      CString str;
      child->GetWindowText(str);
      if (str == caption)
      {
         child->MDIActivate(); // or MDIActivate(child);
         break;
      }

      child = (CMDIChildWnd*)child->GetWindow(GW_HWNDNEXT);
   } while (child);
}

CMDIFrameWnd::MDIActivate

Attiva una finestra figlio MDI diversa.

void MDIActivate(CWnd* pWndActivate);

Parametri

pWndActivate
Punta alla finestra figlio MDI da attivare.

Osservazioni:

Questa funzione membro invia il messaggio WM_MDIACTIVATE sia alla finestra figlio attivata che alla finestra figlio disattivata.

Si tratta dello stesso messaggio inviato se l'utente modifica lo stato attivo in una finestra figlio MDI usando il mouse o la tastiera.

Nota

Una finestra figlio MDI viene attivata indipendentemente dalla finestra cornice MDI. Quando il frame diventa attivo, la finestra figlio che è stata attivata per l'ultima volta viene inviato un messaggio WM_NCACTIVATE per disegnare una cornice di finestra attiva e didascalia barra, ma non riceve un altro messaggio WM_MDIACTIVATE.

Esempio

Vedere l'esempio per CMDIFrameWnd::GetWindowMenuPopup.

CMDIFrameWnd::MDICascade

Dispone tutte le finestre figlio MDI in un formato a catena.

void MDICascade();
void MDICascade(int nType);

Parametri

nType
Specifica un flag a catena. È possibile specificare solo il flag seguente: MDITILE_SKIPDISABLED, che impedisce la propagazione delle finestre figlio MDI disabilitate.

Osservazioni:

La prima versione di MDICascade, senza parametri, esegue a catena tutte le finestre figlio MDI, incluse quelle disabilitate. La seconda versione facoltativamente non comporta la propagazione delle finestre figlio MDI disabilitate se si specifica MDITILE_SKIPDISABLED per il parametro nType .

Esempio

// CMainFrame::OnWindowCommand() is a menu command handler for
// CMainFrame class, which is a CMDIFrameWnd-derived
// class. It handles menu commands for the Windows pop-up menu.
// Its entries in the message map are of the following form:
//    ON_COMMAND_EX(ID_WINDOW_ARRANGE, &CMainFrame::OnWindowCommand)
BOOL CMainFrame::OnWindowCommand(UINT nID)
{
   switch (nID)
   {
   case ID_WINDOW_ARRANGE: // For Window\Arrange Icons menu item, arrange
      MDIIconArrange();    // all minimized document child windows.
      break;

   case ID_WINDOW_CASCADE: // For Window\Cascade menu item, arrange
      MDICascade();        // all the MDI child windows in a cascade format.
      break;

   case ID_WINDOW_TILE_HORZ:       // For Window\Tile Horizontal menu item,
      MDITile(MDITILE_HORIZONTAL); // tile MDI child windows so that
      break;                       // one window appears above another.

   case ID_WINDOW_TILE_VERT:     // For Window\Tile Vertical menu item,
      MDITile(MDITILE_VERTICAL); // tile MDI child windows so that
      break;                     // one window appears beside another.
   }

   return TRUE;
}

CMDIFrameWnd::MDIGetActive

Recupera la finestra figlio MDI attiva corrente, insieme a un flag che indica se la finestra figlio è ingrandita.

CMDIChildWnd* MDIGetActive(BOOL* pbMaximized = NULL) const;

Parametri

pbMaximized
Puntatore a un valore restituito BOOL. Impostare su TRUE al ritorno se la finestra è ingrandita; altrimenti FAL edizione Standard.

Valore restituito

Puntatore alla finestra figlio MDI attiva.

Esempio

Vedere l'esempio per CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDIIconArrange

Dispone tutte le finestre figlio del documento ridotte a icona.

void MDIIconArrange();

Osservazioni:

Non influisce sulle finestre figlio non ridotte a icona.

Esempio

Vedere l'esempio per CMDIFrameWnd::MDICascade.

CMDIFrameWnd::MDIMaximize

Ingrandisce la finestra figlio MDI specificata.

void MDIMaximize(CWnd* pWnd);

Parametri

pWnd
Punta alla finestra per ingrandire.

Osservazioni:

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

Se viene attivata un'altra finestra figlio MDI quando la finestra figlio MDI attualmente attiva è ingrandita, Windows ripristina l'elemento figlio attualmente attivo e ingrandisce la finestra figlio appena attivata.

Esempio

Vedere l'esempio per CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDINext

Attiva la finestra figlio immediatamente dietro la finestra figlio attualmente attiva e posiziona la finestra figlio attualmente attiva dietro tutte le altre finestre figlio.

void MDINext();

Osservazioni:

Se la finestra figlio MDI attualmente attiva è ingrandita, la funzione membro ripristina l'elemento figlio attualmente attivo e ottimizza l'elemento figlio appena attivato.

Esempio

// CMainFrame::OnActivateNextWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It activates the child window immediately behind the currently
// active child window and places the currently active child window
// behind all other child windows.
void CMainFrame::OnActivateNextWindow()
{
   MDINext();
}

CMDIFrameWnd::MDIPrev

Attiva la finestra figlio precedente e posiziona la finestra figlio attualmente attiva immediatamente dietro di essa.

void MDIPrev();

Osservazioni:

Se la finestra figlio MDI attualmente attiva è ingrandita, la funzione membro ripristina l'elemento figlio attualmente attivo e ottimizza l'elemento figlio appena attivato.

CMDIFrameWnd::MDIRestore

Ripristina una finestra figlio MDI dalle dimensioni ingrandita o ridotta a icona.

void MDIRestore(CWnd* pWnd);

Parametri

pWnd
Punta alla finestra da ripristinare.

Esempio

Vedere l'esempio per CMDIChildWnd::MDIRestore.

CMDIFrameWnd::MDISetMenu

Sostituisce il menu di una finestra cornice MDI, il menu a comparsa Finestra o entrambi.

CMenu* MDISetMenu(
    CMenu* pFrameMenu,
    CMenu* pWindowMenu);

Parametri

pFrameMenu
Specifica il menu del nuovo menu finestra cornice. Se NULL, il menu non viene modificato.

pWindowMenu
Specifica il menu del nuovo menu a comparsa Finestra. Se NULL, il menu non viene modificato.

Valore restituito

Puntatore al menu della finestra cornice sostituito da questo messaggio. Il puntatore può essere temporaneo e non deve essere memorizzato per usi successivi.

Osservazioni:

Dopo aver chiamato MDISetMenu, un'applicazione deve chiamare la funzione membro DrawMenuBar di CWnd per aggiornare la barra dei menu.

Se questa chiamata sostituisce il menu a comparsa Finestra, le voci di menu della finestra figlio MDI vengono rimosse dal menu Finestra precedente e aggiunte al nuovo menu a comparsa Finestra.

Se una finestra figlio MDI è ingrandita e questa chiamata sostituisce il menu finestra cornice MDI, il menu Controllo e i controlli di ripristino vengono rimossi dal menu finestra cornice precedente e aggiunti al nuovo menu.

Non chiamare questa funzione membro se si usa il framework per gestire le finestre figlio MDI.

Esempio

// CMdiView::OnReplaceMenu() is a menu command handler for CMdiView
// class, which in turn is a CView-derived class. It loads a new
// menu resource and replaces the main application window's menu
// bar with this new menu.
void CMdiView::OnReplaceMenu()
{
   // Load a new menu resource named IDR_SHORT_MENU. m_hDefaultMenu is
   // a member variable of CMdiDoc class (a CDocument-derived class).
   // Its type is HMENU.
   CMdiDoc *pdoc = (CMdiDoc*)GetDocument();
   pdoc->m_hDefaultMenu =
       ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_SHORT_MENU));
   if (pdoc->m_hDefaultMenu == NULL)
      return;

   // Get the parent window of this view window. The parent window is
   // a CMDIChildWnd-derived class. We can then obtain the MDI parent
   // frame window using the CMDIChildWnd*. Then, replace the current
   // menu bar with the new loaded menu resource.
   CMDIFrameWnd *frame = ((CMDIChildWnd*)GetParent())->GetMDIFrame();
   frame->MDISetMenu(CMenu::FromHandle(pdoc->m_hDefaultMenu), NULL);
   frame->DrawMenuBar();
}

 

// GetDefaultMenu() is an undocumented virtual function for
// CDocument class. It allows the document to determine which
// menu to display. m_hDefaultMenu is of type HMENU. Its value
// is initialized to NULL either in the constructor or
// CDocument::OnNewDocument(). And the menu resource is destroyed
// in the destructor to avoid having too many menus loaded at once.
HMENU CMdiDoc::GetDefaultMenu()
{
   if (m_hDefaultMenu)
      return m_hDefaultMenu;

   return COleServerDoc::GetDefaultMenu();
}

// Initialize member variable(s) in the constructor. CMdiDoc is
// a CDocument-derived class.
CMdiDoc::CMdiDoc()
{
   // Use OLE compound files
   EnableCompoundFile();

   m_hDefaultMenu = NULL; // initialize to NULL
}

// Destroy menu resource in CMdiDoc's destructor. CMdiDoc is
// a CDocument-derived class.
CMdiDoc::~CMdiDoc()
{
   if (m_hDefaultMenu)
      ::DestroyMenu(m_hDefaultMenu);
}

CMDIFrameWnd::MDITile

Dispone tutte le finestre figlio in un formato affiancato.

void MDITile();
void MDITile(int nType);

Parametri

nType
Specifica un flag di associazione. Questo parametro può essere uno dei flag seguenti:

  • MDITILE_HORIZONTAL riquadri finestre figlio MDI in modo che una finestra venga visualizzata sopra un'altra.

  • MDITILE_SKIPDISABLED Impedisce il riquadro delle finestre figlio MDI disabilitate.

  • MDITILE_VERTICAL riquadri finestre figlio MDI in modo che venga visualizzata una finestra accanto a un'altra.

Osservazioni:

La prima versione di MDITile, senza parametri, riquadri le finestre verticalmente nelle versioni di Windows 3.1 e successive. La seconda versione riquadri viene visualizzata verticalmente o orizzontalmente, a seconda del valore del parametro nType .

Esempio

Vedere l'esempio per CMDIFrameWnd::MDICascade.

Vedi anche

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