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 LoadFrame
erstellen, 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.
LoadFrame
erfordert weniger Argumente als Create
, und ruft stattdessen die meisten Standardwerte aus Ressourcen ab, einschließlich der Beschriftung, des Symbols, der Zugriffstastentabelle und des Menüs des Frames. Für den Zugriff auf LoadFrame
alle diese Ressourcen muss dieselbe Ressourcen-ID (z. B. IDR_MAINFRAME) vorhanden sein.
Es wird jedoch MDIFrameWnd
von CFrameWnd
abgeleitet, eine von CMDIFrameWnd
der Framefensterklasse abgeleitete Klasse muss nicht mit DECLARE_DYNCREATE
deklariert 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 Hauptframefenster angegeben sind, sodass 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 CMDIFrameWnd
Sie unter Frame Windows.
Vererbungshierarchie
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 und eine Beschriftungsleiste zu zeichnen, 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 MDISetMenu
muss eine Anwendung die DrawMenuBar-Memberfunktion CWnd
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