CMDIFrameWnd-Klasse

Stellt die Funktionalität eines untergeordneten Windows-MDI-Rahmenfensters (Multiple Document Interface) bereit, zusammen mit Membern zum Verwalten des Fensters.

Syntax

class CMDIFrameWnd : public CFrameWnd

Member

Öffentliche Konstruktoren

Name Beschreibung
CMDIFrameWnd::CMDIFrameWnd Erstellt ein Objekt vom Typ CMDIFrameWnd.

Öffentliche Methoden

Name Beschreibung
CMDIFrameWnd::CreateClient Erstellt dafür ein Windows MDICLIENT-Fenster CMDIFrameWnd. Wird von der OnCreate Memberfunktion von CWnd.
CMDIFrameWnd::CreateNewChild Erstellt ein neues untergeordnetes Fenster.
CMDIFrameWnd::GetWindowMenuPopup Gibt das Popupmenü "Fenster" zurück.
CMDIFrameWnd::MDIActivate Aktiviert ein anderes untergeordnetes MDI-Fenster.
CMDIFrameWnd::MDICascade Ordnet alle untergeordneten Fenster in einem überlappenden Format an.
CMDIFrameWnd::MDIGetActive Ruft das derzeit aktive untergeordnete MDI-Fenster zusammen mit einem Flag ab, das angibt, ob das untergeordnete Element maximiert ist.
CMDIFrameWnd::MDIIconArrange Ordnet alle minimierten untergeordneten Dokumentfenster an.
CMDIFrameWnd::MDIMaximize Maximiert ein untergeordnetes MDI-Fenster.
CMDIFrameWnd::MDINext Aktiviert das untergeordnete Fenster unmittelbar hinter dem aktuell aktiven untergeordneten Fenster und platziert das derzeit aktive untergeordnete Fenster hinter allen anderen untergeordneten Fenstern.
CMDIFrameWnd::MDIPrev Aktiviert das vorherige untergeordnete Fenster und platziert das aktuell aktive untergeordnete Fenster unmittelbar dahinter.
CMDIFrameWnd::MDIRestore Stellt ein untergeordnetes MDI-Fenster aus maximierter oder minimierter Größe wieder her.
CMDIFrameWnd::MDISetMenu Ersetzt das Menü eines MDI-Rahmenfensters, des Popupmenüs "Fenster" oder beides.
CMDIFrameWnd::MDITile Ordnet alle untergeordneten Fenster in einem nebeneinander angeordneten Format an.

Hinweise

Um ein nützliches MDI-Framefenster für Ihre Anwendung zu erstellen, leiten Sie eine Klasse von CMDIFrameWnd. Fügen Sie der abgeleiteten Klasse Membervariablen hinzu, um datenspezifisch für Ihre Anwendung zu speichern. Implementieren Sie Meldungshandler-Memberfunktionen und eine Meldungszuordnung in der abgeleiteten Klasse, um anzugeben, was passiert, wenn Meldungen an das Fenster weitergeleitet werden.

Sie können ein MDI-Framefenster erstellen, indem Sie die Memberfunktion Create oder LoadFrame aufrufen.CFrameWnd

Bevor Sie das Framefensterobjekt auf dem Heap mit dem C++new-Operator aufrufen Create oder LoadFrameerstellen, müssen Sie es erstellen. Vor dem Aufrufen Create können Sie auch eine Fensterklasse mit der globalen Funktion AfxRegisterWndClass registrieren, um die Symbol- und Klassenformatvorlagen für den Frame festzulegen.

Verwenden Sie die Create Memberfunktion, um die Erstellungsparameter des Frames als direkte Argumente zu übergeben.

LoadFrameerfordert weniger Argumente als Createund ruft stattdessen die meisten Standardwerte aus Ressourcen ab, einschließlich der Untertitel, des Symbols, der Zugriffstastentabelle und des Menüs des Frames. Für den Zugriff auf LoadFramealle diese Ressourcen muss dieselbe Ressourcen-ID (z. B. IDR_MAINFRAME) vorhanden sein.

Es wird jedoch MDIFrameWnd von CFrameWndabgeleitet, eine von CMDIFrameWnd der Framefensterklasse abgeleitete Klasse muss nicht mit DECLARE_DYNCREATEdeklariert werden.

Die CMDIFrameWnd Klasse erbt einen Großteil der Standardimplementierung von CFrameWnd. Eine detaillierte Liste dieser Features finden Sie in der CFrameWnd-Klassenbeschreibung . Die CMDIFrameWnd Klasse verfügt über die folgenden zusätzlichen Features:

  • Ein MDI-Framefenster verwaltet das MDICLIENT-Fenster und positioniert es in Verbindung mit Steuerleisten. Das MDI-Clientfenster ist das direkte übergeordnete Element von untergeordneten MDI-Framefenstern. Die WS_HSCROLL- und WS_VSCROLL Fensterformatvorlagen, die für das CMDIFrameWnd MDI-Clientfenster und nicht für das Standard Framefenster angegeben sind, damit der Benutzer den MDI-Clientbereich scrollen kann (z. B. im Windows-Programm-Manager).

  • Ein MDI-Rahmenfenster besitzt ein Standardmenü, das als Menüleiste verwendet wird, wenn kein aktives untergeordnetes MDI-Fenster vorhanden ist. Wenn ein aktives untergeordnetes MDI-Element vorhanden ist, wird die Menüleiste des MDI-Rahmenfensters automatisch durch das untergeordnete MDI-Fenstermenü ersetzt.

  • Ein MDI-Rahmenfenster funktioniert in Verbindung mit dem aktuellen untergeordneten MDI-Fenster, falls vorhanden. Befehlsmeldungen werden z. B. vor dem MDI-Framefenster an das derzeit aktive untergeordnete MDI-Element delegiert.

  • Ein MDI-Framefenster verfügt über Standardhandler für die folgenden standardmäßigen Fenstermenübefehle:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Ein MDI-Framefenster verfügt auch über eine Implementierung von ID_WINDOW_NEW, die einen neuen Frame und eine neue Ansicht im aktuellen Dokument erstellt. Eine Anwendung kann diese Standardbefehlsimplementierungen überschreiben, um die MDI-Fensterbehandlung anzupassen.

Verwenden Sie nicht den C++ delete -Operator, um ein Framefenster zu zerstören. Verwenden Sie stattdessen CWnd::DestroyWindow. Durch die CFrameWnd Implementierung PostNcDestroy wird das C++-Objekt gelöscht, wenn das Fenster zerstört wird. Wenn der Benutzer das Framefenster schließt, wird der Standardhandler OnClose aufgerufen DestroyWindow.

Weitere Informationen finden CMDIFrameWndSie unter Frame Windows.

Vererbungshierarchie

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

Anforderungen

Header: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

Erstellt ein CMDIFrameWnd-Objekt.

CMDIFrameWnd();

Hinweise

Rufen Sie die Create Funktion oder LoadFrame Member auf, um das sichtbare MDI-Framefenster zu erstellen.

Beispiel

// 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

Erstellt das MDI-Clientfenster, das die CMDIChildWnd Objekte verwaltet.

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

Parameter

lpCreateStruct
Ein langer Zeiger auf eine CREATESTRUCT-Struktur .

pWindowMenu
Ein Zeiger auf das Popupmenü "Fenster".

Rückgabewert

Ungleich Null, wenn erfolgreich, andernfalls 0 (Null).

Hinweise

Diese Memberfunktion sollte aufgerufen werden, wenn Sie die OnCreate Memberfunktion direkt überschreiben.

Beispiel

// 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

Erstellt ein neues untergeordnetes Fenster.

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

Parameter

pClass
Die Laufzeitklasse des zu erstellenden untergeordneten Fensters.

nResource
Die ID der freigegebenen Ressourcen, die dem untergeordneten Fenster zugeordnet sind.

Hmenu
Das Menü des untergeordneten Fensters.

hAccel
Die Zugriffstaste des untergeordneten Fensters.

Hinweise

Verwenden Sie diese Funktion, um untergeordnete Fenster eines MDI-Rahmenfensters zu erstellen.

Beispiel

// 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

Rufen Sie diese Memberfunktion auf, um ein Handle für das aktuelle Popupmenü mit dem Namen "Fenster" zu erhalten (das Popupmenü mit Menüelementen für die MDI-Fensterverwaltung).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Parameter

hMenuBar
Die aktuelle Menüleiste.

Rückgabewert

Das Popupmenü "Fenster", falls vorhanden; andernfalls NULL.

Hinweise

Die Standardimplementierung sucht nach einem Popupmenü mit standardmäßigen Fenstermenübefehlen wie ID_WINDOW_NEW und ID_WINDOW_TILE_HORZ.

Überschreiben Sie diese Memberfunktion, wenn Sie über ein Fenstermenü verfügen, das die Standardmenübefehls-IDs nicht verwendet.

Beispiel

// 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

Aktiviert ein anderes untergeordnetes MDI-Fenster.

void MDIActivate(CWnd* pWndActivate);

Parameter

pWndActivate
Verweist auf das untergeordnete MDI-Fenster, das aktiviert werden soll.

Hinweise

Diese Memberfunktion sendet die WM_MDIACTIVATE Nachricht sowohl an das zu aktivierende untergeordnete Fenster als auch an das untergeordnete Fenster, das deaktiviert wird.

Dies ist dieselbe Nachricht, die gesendet wird, wenn der Benutzer den Fokus mithilfe der Maus oder Tastatur in ein untergeordnetes MDI-Fenster ändert.

Hinweis

Ein untergeordnetes MDI-Fenster wird unabhängig vom MDI-Framefenster aktiviert. Wenn der Frame aktiv wird, wird das zuletzt aktivierte untergeordnete Fenster eine WM_NCACTIVATE Nachricht gesendet, um einen aktiven Fensterrahmen zu zeichnen, und Untertitel Leiste, erhält jedoch keine weitere WM_MDIACTIVATE Nachricht.

Beispiel

Sehen Sie sich das Beispiel für CMDIFrameWnd::GetWindowMenuPopup an.

CMDIFrameWnd::MDICascade

Ordnet alle untergeordneten MDI-Fenster in einem Kaskadenformat an.

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

Parameter

nType
Gibt eine Kaskadenkennzeichnung an. Es kann nur das folgende Flag angegeben werden: MDITILE_SKIPDISABLED, wodurch verhindert wird, dass deaktivierte untergeordnete MDI-Fenster überlappend werden.

Hinweise

Die erste Version von MDICascade, ohne Parameter, kaskadiert alle untergeordneten MDI-Fenster, einschließlich deaktivierter Fenster. Die zweite Version übergibt optional keine deaktivierten untergeordneten MDI-Fenster, wenn Sie MDITILE_SKIPDISABLED für den nType-Parameter angeben.

Beispiel

// 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

Ruft das aktuelle aktive untergeordnete MDI-Fenster zusammen mit einem Flag ab, das angibt, ob das untergeordnete Fenster maximiert ist.

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

Parameter

pbMaximized
Ein Zeiger auf einen BOOL-Rückgabewert. Bei Rückgabe auf TRUE festgelegt, wenn das Fenster maximiert ist; andernfalls FALSE.

Rückgabewert

Ein Zeiger auf das aktive untergeordnete MDI-Fenster.

Beispiel

Sehen Sie sich das Beispiel für CMDIChildWnd::MDIMaximize an.

CMDIFrameWnd::MDIIconArrange

Ordnet alle minimierten untergeordneten Dokumentfenster an.

void MDIIconArrange();

Hinweise

Es wirkt sich nicht auf untergeordnete Fenster aus, die nicht minimiert werden.

Beispiel

Sehen Sie sich das Beispiel für CMDIFrameWnd::MDICascade an.

CMDIFrameWnd::MDIMaximize

Maximiert das angegebene untergeordnete MDI-Fenster.

void MDIMaximize(CWnd* pWnd);

Parameter

pWnd
Verweist auf das Zu maximierende Fenster.

Hinweise

Wenn ein untergeordnetes Fenster maximiert wird, ändert Windows die Größe, damit der Clientbereich das Clientfenster ausfüllt. Windows platziert das Menü "Steuerelement" des untergeordneten Fensters in der Menüleiste des Frames, damit der Benutzer das untergeordnete Fenster wiederherstellen oder schließen kann. Außerdem wird der Titel des untergeordneten Fensters dem Titel des Rahmenfensters hinzugefügt.

Wenn ein weiteres untergeordnetes MDI-Fenster aktiviert wird, wenn das derzeit aktive untergeordnete MDI-Fenster maximiert wird, stellt Windows das derzeit aktive untergeordnete Fenster wieder her und maximiert das neu aktivierte untergeordnete Fenster.

Beispiel

Sehen Sie sich das Beispiel für CMDIChildWnd::MDIMaximize an.

CMDIFrameWnd::MDINext

Aktiviert das untergeordnete Fenster unmittelbar hinter dem aktuell aktiven untergeordneten Fenster und platziert das derzeit aktive untergeordnete Fenster hinter allen anderen untergeordneten Fenstern.

void MDINext();

Hinweise

Wenn das derzeit aktive untergeordnete MDI-Fenster maximiert ist, stellt die Memberfunktion das derzeit aktive untergeordnete Element wieder her und maximiert das neu aktivierte untergeordnete Element.

Beispiel

// 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

Aktiviert das vorherige untergeordnete Fenster und platziert das aktuell aktive untergeordnete Fenster unmittelbar dahinter.

void MDIPrev();

Hinweise

Wenn das derzeit aktive untergeordnete MDI-Fenster maximiert ist, stellt die Memberfunktion das derzeit aktive untergeordnete Element wieder her und maximiert das neu aktivierte untergeordnete Element.

CMDIFrameWnd::MDIRestore

Stellt ein untergeordnetes MDI-Fenster aus maximierter oder minimierter Größe wieder her.

void MDIRestore(CWnd* pWnd);

Parameter

pWnd
Zeigt auf das Fenster, das wiederhergestellt werden soll.

Beispiel

Sehen Sie sich das Beispiel für CMDIChildWnd::MDIRestore an.

CMDIFrameWnd::MDISetMenu

Ersetzt das Menü eines MDI-Rahmenfensters, des Popupmenüs "Fenster" oder beides.

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

Parameter

pFrameMenu
Gibt das Menü des neuen Framefenstermenüs an. Wenn NULL, wird das Menü nicht geändert.

pWindowMenu
Gibt das Menü des neuen Popupmenüs "Fenster" an. Wenn NULL, wird das Menü nicht geändert.

Rückgabewert

Ein Zeiger auf das Rahmenfenstermenü, das durch diese Nachricht ersetzt wird. Der Zeiger kann temporär sein und sollte nicht für eine spätere Verwendung gespeichert werden.

Hinweise

Nach dem Aufrufen MDISetMenumuss eine Anwendung die DrawMenuBar-MemberfunktionCWnd aufrufen, um die Menüleiste zu aktualisieren.

Wenn dieser Aufruf das Popupmenü "Fenster" ersetzt, werden untergeordnete MDI-Menüelemente aus dem vorherigen Fenstermenü entfernt und dem neuen Popupmenü "Fenster" hinzugefügt.

Wenn ein untergeordnetes MDI-Fenster maximiert ist und dieser Aufruf das MDI-Framefenstermenü ersetzt, werden das Steuerelementmenü und die Wiederherstellungssteuerelemente aus dem vorherigen Framefenstermenü entfernt und dem neuen Menü hinzugefügt.

Rufen Sie diese Memberfunktion nicht auf, wenn Sie das Framework zum Verwalten ihrer untergeordneten MDI-Fenster verwenden.

Beispiel

// 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

Ordnet alle untergeordneten Fenster in einem nebeneinander angeordneten Format an.

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

Parameter

nType
Gibt eine Kachelkennzeichnung an. Dieser Parameter kann eine der folgenden Flags sein:

  • MDITILE_HORIZONTAL untergeordnete Fenster für Kacheln MDI, sodass ein Fenster über einem anderen angezeigt wird.

  • MDITILE_SKIPDISABLED Verhindert, dass deaktivierte untergeordnete MDI-Fenster nebeneinander angeordnet werden.

  • MDITILE_VERTICAL untergeordnete Fenster für Kacheln MDI, sodass ein Fenster neben einem anderen angezeigt wird.

Hinweise

Die erste Version von MDITile, ohne Parameter, kachelt die Fenster vertikal unter Windows-Versionen 3.1 und höher. Die zweite Version kacheln vertikal oder horizontal, abhängig vom Wert des nType-Parameters .

Beispiel

Sehen Sie sich das Beispiel für CMDIFrameWnd::MDICascade an.

Siehe auch

MFC-Beispiel-MDI
MFC-Beispiel MDIDOCVW
MFC-Beispiel SNAPVW
CFrameWnd-Klasse
Hierarchiediagramm
CWnd-Klasse
CMDIChildWnd-Klasse