Freigeben über


CMDIChildWnd-Klasse

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

Syntax

class CMDIChildWnd : public CFrameWnd

Member

Öffentliche Konstruktoren

Name Beschreibung
CMDIChildWnd::CMDIChildWnd Erstellt ein CMDIChildWnd-Objekt.

Öffentliche Methoden

Name Beschreibung
CMDIChildWnd::Create Erstellt das untergeordnete Windows MDI-Fenster, das dem CMDIChildWnd Objekt zugeordnet ist.
CMDIChildWnd::GetMDIFrame Gibt den übergeordneten MDI-Frame des MDI-Clientfensters zurück.
CMDIChildWnd::MDIActivate Aktiviert dieses untergeordnete MDI-Fenster.
CMDIChildWnd::MDIDestroy Zerstört dieses untergeordnete MDI-Fenster.
CMDIChildWnd::MDIMaximize Maximiert dieses untergeordnete MDI-Fenster.
CMDIChildWnd::MDIRestore Stellt dieses untergeordnete MDI-Fenster aus maximierter oder minimierter Größe wieder her.
CMDIChildWnd::SetHandles Legt die Handles für Menü- und Zugriffstastenressourcen fest.

Hinweise

Ein untergeordnetes MDI-Fenster sieht ähnlich wie ein typisches Rahmenfenster aus, mit der Ausnahme, dass das untergeordnete MDI-Fenster in einem MDI-Rahmenfenster statt auf dem Desktop angezeigt wird. Ein untergeordnetes MDI-Fenster verfügt nicht über eine eigene Menüleiste, sondern teilt stattdessen das Menü des MDI-Rahmenfensters. Das Framework ändert automatisch das MDI-Framemenü so, dass es das derzeit aktive untergeordnete MDI-Fenster darstellt.

Um ein nützliches untergeordnetes MDI-Fenster für Ihre Anwendung zu erstellen, leiten Sie eine Klasse von CMDIChildWnd. 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.

Es gibt drei Möglichkeiten zum Erstellen eines untergeordneten MDI-Fensters:

  • Erstellen Sie es direkt mithilfe von Create.

  • Erstellen Sie es direkt mithilfe von LoadFrame.

  • Erstellen Sie sie indirekt über eine Dokumentvorlage.

Bevor Sie das Framefensterobjekt auf dem Heap mit dem C++new-Operator aufrufen Create oder LoadFrameerstellen, müssen Sie das Framefensterobjekt 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. Um auf LoadFramediese Ressourcen zugreifen zu können, müssen alle diese Ressourcen über dieselbe Ressourcen-ID verfügen (z. B. IDR_MAINFRAME).

Wenn ein CMDIChildWnd Objekt Ansichten und Dokumente enthält, werden sie indirekt vom Framework statt direkt vom Programmierer erstellt. Das CDocTemplate Objekt koordiniert die Erstellung des Frames, die Erstellung der enthaltenden Ansichten und die Verbindung der Ansichten mit dem entsprechenden Dokument. Die Parameter des CDocTemplate Konstruktors geben die CRuntimeClass drei beteiligten Klassen an (Dokument, Frame und Ansicht). Ein CRuntimeClass Objekt wird vom Framework verwendet, um dynamisch neue Frames zu erstellen, wenn er vom Benutzer angegeben wird (z. B. mithilfe des Befehls "Datei neu" oder mit dem Befehl "MDI-Fenster neu").

Eine von CMDIChildWnd DECLARE_DYNCREATE abgeleitete Framefensterklasse muss mit DECLARE_DYNCREATE deklariert werden, damit der oben genannte RUNTIME_CLASS Mechanismus ordnungsgemäß funktioniert.

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

  • In Verbindung mit der CMultiDocTemplate Klasse verwenden mehrere CMDIChildWnd Objekte aus derselben Dokumentvorlage dasselbe Menü, wodurch Windows-Systemressourcen gespeichert werden.

  • Das derzeit aktive untergeordnete MDI-Fenstermenü ersetzt das Menü des MDI-Rahmenfensters vollständig, und die Beschriftung des derzeit aktiven untergeordneten MDI-Fensters wird der Beschriftung des MDI-Rahmenfensters hinzugefügt. Weitere Beispiele für untergeordnete MDI-Fensterfunktionen, die in Verbindung mit einem MDI-Framefenster implementiert werden, finden Sie in der CMDIFrameWnd Klassenbeschreibung.

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 CMDIChildWndSie unter Frame Windows.

Vererbungshierarchie

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIChildWnd

Anforderungen

Header: afxwin.h

CMDIChildWnd::CMDIChildWnd

Aufrufen zum Erstellen eines CMDIChildWnd Objekts.

CMDIChildWnd();

Hinweise

Rufen Sie Create auf, um das sichtbare Fenster zu erstellen.

Beispiel

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

CMDIChildWnd::Create

Rufen Sie diese Memberfunktion auf, um ein untergeordnetes Windows MDI-Fenster zu erstellen und an das CMDIChildWnd Objekt anzufügen.

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);

Parameter

lpszClassName
Verweist auf eine mit Null beendete Zeichenfolge, die die Windows-Klasse (eine WNDCLASS-Struktur ) benennt. Der Klassenname kann ein beliebiger Name sein, der mit der globalen Funktion AfxRegisterWndClass registriert ist. Sollte NULL für einen Standard CMDIChildWndsein.

lpszWindowName
Verweist auf eine mit Null beendete Zeichenfolge, die den Fensternamen darstellt. Wird als Text für die Titelleiste verwendet.

dwStyle
Gibt die Attribute der Fensterformatvorlage an. Die WS_CHILD Formatvorlage ist erforderlich.

rect
Enthält die Größe und Position des Fensters. Mit rectDefault dem Wert kann Windows die Größe und Position des neuen CMDIChildWndWerts angeben.

pParentWnd
Gibt das übergeordnete Fenster an. Wenn NULL, wird das Hauptanwendungsfenster verwendet.

pContext
Gibt eine CCreateContext-Struktur an. Dieser Parameter kann NULL sein.

Rückgabewert

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

Hinweise

Das derzeit aktive untergeordnete MDI-Framefenster kann die Beschriftung des übergeordneten Framefensters bestimmen. Dieses Feature ist deaktiviert, indem das FWS_ADDTOTITLE Formatvorlagenbit des untergeordneten Framefensters deaktiviert wird.

Das Framework ruft diese Memberfunktion als Reaktion auf einen Benutzerbefehl auf, um ein untergeordnetes Fenster zu erstellen, und das Framework verwendet den pContext-Parameter , um das untergeordnete Fenster ordnungsgemäß mit der Anwendung zu verbinden. Wenn Sie aufrufen Create, kann pContext NULL sein.

Beispiel 1

In diesem Beispielmenübefehlshandler wird aufgerufen, um ein untergeordnetes Create MDI-Fenster zu erstellen:

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

Beispiel 2

Der Beispielcode ruft die Create Methode der CHelloWndKlasse auf, die von 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
}

Dieses Beispiel zeigt die Create Implementierung der CHelloWnd Klasse:

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

Rufen Sie diese Funktion auf, um den übergeordneten MDI-Frame zurückzugeben.

CMDIFrameWnd* GetMDIFrame();

Rückgabewert

Ein Zeiger auf das übergeordnete MDI-Rahmenfenster.

Hinweise

Der zurückgegebene Frame ist zwei übergeordnete Elemente, die aus dem CMDIChildWnd Fenster des Typs MDICLIENT entfernt wurden, das das CMDIChildWnd Objekt verwaltet. Rufen Sie die GetParent-Memberfunktion auf, um das direkt übergeordnete MDICLIENT-Element des CMDIChildWnd Objekts als temporären CWnd Zeiger zurückzugeben.

Beispiel

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

CMDIChildWnd::MDIActivate

Rufen Sie diese Memberfunktion auf, um ein untergeordnetes MDI-Fenster unabhängig vom MDI-Framefenster zu aktivieren.

void MDIActivate();

Hinweise

Wenn der Frame aktiv wird, wird auch das zuletzt aktivierte untergeordnete Fenster aktiviert.

Beispiel

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

CMDIChildWnd::MDIDestroy

Rufen Sie diese Memberfunktion auf, um ein untergeordnetes MDI-Fenster zu zerstören.

void MDIDestroy();

Hinweise

Die Memberfunktion entfernt den Titel des untergeordneten Fensters aus dem Rahmenfenster und deaktiviert das untergeordnete Fenster.

Beispiel

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

Rufen Sie diese Memberfunktion auf, um ein untergeordnetes MDI-Fenster zu maximieren.

void MDIMaximize();

Hinweise

Wenn ein untergeordnetes Fenster maximiert wird, ändert Windows seine Größe, damit der Clientbereich den Clientbereich des Framefensters ausfüllt. Windows platziert das Menü "Steuerelement" des untergeordneten Fensters in der Menüleiste des Frames, sodass der Benutzer das untergeordnete Fenster wiederherstellen oder schließen kann und den Titel des untergeordneten Fensters dem Titel des Rahmenfensters hinzufügt.

Beispiel

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

Rufen Sie diese Memberfunktion auf, um ein untergeordnetes MDI-Fenster aus maximierter oder minimierter Größe wiederherzustellen.

void MDIRestore();

Beispiel

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

Legt die Handles für Menü- und Zugriffstastenressourcen fest.

void SetHandles(
    HMENU hMenu,
    HACCEL hAccel);

Parameter

hMenu
Das Handle einer Menüressource.

hAccel
Das Handle einer Zugriffstastenressource.

Hinweise

Rufen Sie diese Funktion auf, um die Menü- und Zugriffstastenressourcen festzulegen, die vom untergeordneten MDI-Fensterobjekt verwendet werden.

Siehe auch

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