Share via


CMDIFrameWnd-klasse

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Biedt de functionaliteit van een venster met meerdere documentinterfaces (MDI) van Windows, samen met leden voor het beheren van het venster.

Syntaxis

class CMDIFrameWnd : public CFrameWnd

Leden

Openbare constructors

Naam Description
CMDIFrameWnd::CMDIFrameWnd Maakt een CMDIFrameWnd.

Openbare methoden

Naam Description
CMDIFrameWnd::CreateClient Hiermee maakt u een Windows MDICLIENT-venster voor dit CMDIFrameWnd. Aangeroepen door de OnCreate lidfunctie van CWnd.
CMDIFrameWnd::CreateNewChild Hiermee maakt u een nieuw onderliggend venster.
CMDIFrameWnd::GetWindowMenuPopup Retourneert het snelmenu Venster.
CMDIFrameWnd::MDIActivate Hiermee activeert u een ander onderliggend MDI-venster.
CMDIFrameWnd::MDICascade Hiermee rangschikt u alle onderliggende vensters in trapsgewijze indeling.
CMDIFrameWnd::MDIGetActive Hiermee wordt het momenteel actieve MDI-onderliggende venster opgehaald, samen met een vlag die aangeeft of het kind is gemaximaliseerd.
CMDIFrameWnd::MDIIconArrange Hiermee rangschikt u alle geminimaliseerde onderliggende vensters van het document.
CMDIFrameWnd::MDIMaximize Hiermee maximaliseert u een onderliggend MDI-venster.
CMDIFrameWnd::MDINext Activeert het onderliggende venster direct achter het actieve onderliggende venster en plaatst het momenteel actieve onderliggende venster achter alle andere onderliggende vensters.
CMDIFrameWnd::MDIPrev Activeert het vorige onderliggende venster en plaatst het momenteel actieve onderliggende venster direct erachter.
CMDIFrameWnd::MDIRestore Hiermee herstelt u een onderliggend MDI-venster van gemaximaliseerde of geminimaliseerde grootte.
CMDIFrameWnd::MDISetMenu Vervangt het menu van een MDI-framevenster, het snelmenu Venster of beide.
CMDIFrameWnd::MDITile Rangschikt alle onderliggende vensters in een betegelde indeling.

Opmerkingen

Als u een nuttig MDI-framevenster voor uw toepassing wilt maken, moet u een klasse afleiden van CMDIFrameWnd. Voeg lidvariabelen toe aan de afgeleide klasse om gegevens op te slaan die specifiek zijn voor uw toepassing. Implementeer berichtenhandlerlidfuncties en een berichttoewijzing in de afgeleide klasse om op te geven wat er gebeurt wanneer berichten naar het venster worden omgeleid.

U kunt een MDI-framevenster maken door de functie Create of LoadFrame-lid van CFrameWnd.

Voordat u aanroept Create of LoadFrame, moet u het framevensterobject op de heap maken met behulp van de C++ new -operator. Voordat u aanroept Create , kunt u ook een vensterklasse registreren met de globale functie AfxRegisterWndClass om het pictogram en de klassestijlen voor het frame in te stellen.

Gebruik de Create lidfunctie om de aanmaakparameters van het frame door te geven als directe argumenten.

LoadFrame vereist minder argumenten dan Createen haalt in plaats daarvan de meeste standaardwaarden op uit resources, waaronder het bijschrift, pictogram, de tabel accelerator en het menu van het frame. Als u toegang wilt krijgen tot LoadFramedeze resources, moeten al deze resources dezelfde resource-id hebben (bijvoorbeeld IDR_MAINFRAME).

Hoewel MDIFrameWnd is afgeleid van CFrameWnd, hoeft een framevensterklasse die is afgeleid van CMDIFrameWnd niet te worden gedeclareerd met DECLARE_DYNCREATE.

De CMDIFrameWnd klasse neemt veel van de standaard implementatie over van CFrameWnd. Raadpleeg de beschrijving van de CFrameWnd-klasse voor een gedetailleerde lijst met deze functies. De CMDIFrameWnd klasse heeft de volgende aanvullende functies:

  • Een MDI-framevenster beheert het MDICLIENT-venster, waarbij het venster wordt verplaatst in combinatie met besturingsbalken. Het MDI-clientvenster is de directe bovenliggende van MDI-onderliggende framevensters. De WS_HSCROLL en WS_VSCROLL vensterstijlen die zijn opgegeven in een CMDIFrameWnd toepassing op het MDI-clientvenster in plaats van het hoofdframevenster, zodat de gebruiker het MDI-clientgebied kan schuiven (zoals in Windows Program Manager).

  • Een MDI-framevenster is eigenaar van een standaardmenu dat wordt gebruikt als de menubalk wanneer er geen actief MDI-onderliggend venster is. Wanneer er een actief MDI-onderliggend element is, wordt de menubalk van het MDI-framevenster automatisch vervangen door het subvenstermenu van MDI.

  • Een MDI-framevenster werkt in combinatie met het huidige MDI-onderliggende venster, als er een is. Opdrachtberichten worden bijvoorbeeld gedelegeerd aan het actieve MDI-onderliggend element voor het MDI-framevenster.

  • Een MDI-framevenster heeft standaardhandlers voor de volgende standaardmenuopdrachten voor vensters:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Een MDI-framevenster heeft ook een implementatie van ID_WINDOW_NEW, waarmee een nieuw frame en weergave in het huidige document wordt gemaakt. Een toepassing kan deze standaardopdrachtimplementaties overschrijven om de verwerking van MDI-vensters aan te passen.

Gebruik de C++ delete -operator niet om een framevenster te vernietigen. Gebruik in plaats daarvan CWnd::DestroyWindow. De CFrameWnd implementatie van PostNcDestroy het C++-object wordt verwijderd wanneer het venster wordt vernietigd. Wanneer de gebruiker het framevenster sluit, wordt de standaardhandler OnClose aangeroepen DestroyWindow.

Zie Frame Windows voor meer informatieCMDIFrameWnd.

Overnamehiƫrarchie

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

Requirements

Koptekst: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

Maakt een CMDIFrameWnd object.

CMDIFrameWnd();

Opmerkingen

Roep de Create functie of LoadFrame lid aan om het zichtbare MDI-framevenster te maken.

Example

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

Hiermee maakt u het MDI-clientvenster waarmee de CMDIChildWnd objecten worden beheerd.

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

Parameterwaarden

lpCreateStruct
Een lange aanwijzer naar een CREATESTRUCT-structuur .

pWindowMenu
Een aanwijzer naar het snelmenu Venster.

Retourwaarde

Niet-nul indien geslaagd; anders 0.

Opmerkingen

Deze lidfunctie moet worden aangeroepen als u de OnCreate lidfunctie rechtstreeks overschrijft.

Example

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

Hiermee maakt u een nieuw onderliggend venster.

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

Parameterwaarden

pClass
De runtimeklasse van het onderliggende venster dat moet worden gemaakt.

nResource
De id van gedeelde resources die zijn gekoppeld aan het onderliggende venster.

hMenu
Het menu van het onderliggende venster.

hAccel
De versneller van het onderliggende venster.

Opmerkingen

Gebruik deze functie om onderliggende vensters van een MDI-framevenster te maken.

Example

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

Roep deze lidfunctie aan om een ingang te verkrijgen voor het huidige pop-upmenu met de naam 'Venster' (het pop-upmenu met menu-items voor MDI-vensterbeheer).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Parameterwaarden

hMenuBalk
De huidige menubalk.

Retourwaarde

Het snelmenu Venster als er een bestaat; anders NULL.

Opmerkingen

De standaard implementatie zoekt naar een snelmenu met standaardmenuopdrachten voor vensters, zoals ID_WINDOW_NEW en ID_WINDOW_TILE_HORZ.

Overschrijf deze lidfunctie als u een venstermenu hebt dat niet gebruikmaakt van de standaardmenuopdracht-id's.

Example

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

Hiermee activeert u een ander onderliggend MDI-venster.

void MDIActivate(CWnd* pWndActivate);

Parameterwaarden

pWndActivate
Verwijst naar het onderliggende MDI-venster dat moet worden geactiveerd.

Opmerkingen

Met deze lidfunctie wordt het WM_MDIACTIVATE bericht verzonden naar zowel het onderliggende venster dat wordt geactiveerd als het onderliggende venster dat wordt gedeactiveerd.

Dit is hetzelfde bericht dat wordt verzonden als de gebruiker de focus wijzigt in een MDI-onderliggend venster met behulp van de muis of het toetsenbord.

Opmerking

Een onderliggend MDI-venster wordt onafhankelijk van het MDI-framevenster geactiveerd. Wanneer het frame actief wordt, wordt het onderliggende venster dat voor het laatst is geactiveerd een WM_NCACTIVATE bericht verzonden om een actief vensterkader en ondertitelingsbalk te tekenen, maar er wordt geen ander WM_MDIACTIVATE bericht ontvangen.

Example

Zie het voorbeeld voor CMDIFrameWnd::GetWindowMenuPopup.

CMDIFrameWnd::MDICascade

Hiermee rangschikt u alle onderliggende MDI-vensters in trapsgewijze indeling.

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

Parameterwaarden

nType
Hiermee geeft u een trapsgewijze vlag. Alleen de volgende vlag kan worden opgegeven: MDITILE_SKIPDISABLED, waardoor uitgeschakelde MDI-onderliggende vensters trapsgewijs worden geblokkeerd.

Opmerkingen

De eerste versie van MDICascade, zonder parameters, trapsgewijs alle MDI onderliggende vensters, inclusief uitgeschakelde vensters. De tweede versie kan optioneel geen onderliggende MDI-vensters trapsgewijs uitschakelen als u MDITILE_SKIPDISABLED opgeeft voor de parameter nType .

Example

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

Hiermee wordt het huidige actieve MDI-onderliggende venster opgehaald, samen met een vlag die aangeeft of het onderliggende venster is gemaximaliseerd.

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

Parameterwaarden

pbMaximized
Een aanwijzer naar een BOOL-retourwaarde. Ingesteld op TRUE bij terugkeer als het venster is gemaximaliseerd; anders ONWAAR.

Retourwaarde

Een aanwijzer naar het actieve MDI-onderliggende venster.

Example

Zie het voorbeeld voor CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDIIconArrange

Hiermee rangschikt u alle geminimaliseerde onderliggende vensters van het document.

void MDIIconArrange();

Opmerkingen

Het heeft geen invloed op onderliggende vensters die niet zijn geminimaliseerd.

Example

Zie het voorbeeld voor CMDIFrameWnd::MDICascade.

CMDIFrameWnd::MDIMaximize

Hiermee wordt het opgegeven MDI-onderliggende venster gemaximaliseerd.

void MDIMaximize(CWnd* pWnd);

Parameterwaarden

pWnd
Verwijst naar het venster om te maximaliseren.

Opmerkingen

Wanneer een onderliggend venster is gemaximaliseerd, wordt het formaat ervan aangepast zodat het clientgebied het clientvenster vult. Het besturingselementmenu van het onderliggende venster wordt in de menubalk van het frame geplaatst, zodat de gebruiker het onderliggende venster kan herstellen of sluiten. Ook wordt de titel van het onderliggende venster toegevoegd aan de titel van het framevenster.

Als een ander MDI-onderliggend venster wordt geactiveerd wanneer het momenteel actieve MDI-onderliggende venster is gemaximaliseerd, herstelt Windows het huidige actieve onderliggende venster en maximaliseert het zojuist geactiveerde onderliggende venster.

Example

Zie het voorbeeld voor CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDINext

Activeert het onderliggende venster direct achter het actieve onderliggende venster en plaatst het momenteel actieve onderliggende venster achter alle andere onderliggende vensters.

void MDINext();

Opmerkingen

Als het momenteel actieve MDI-onderliggende venster is gemaximaliseerd, herstelt de lidfunctie het huidige actieve onderliggende element en maximaliseert het zojuist geactiveerde kind.

Example

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

Activeert het vorige onderliggende venster en plaatst het momenteel actieve onderliggende venster direct erachter.

void MDIPrev();

Opmerkingen

Als het momenteel actieve MDI-onderliggende venster is gemaximaliseerd, herstelt de lidfunctie het huidige actieve onderliggende element en maximaliseert het zojuist geactiveerde kind.

CMDIFrameWnd::MDIRestore

Hiermee herstelt u een onderliggend MDI-venster van gemaximaliseerde of geminimaliseerde grootte.

void MDIRestore(CWnd* pWnd);

Parameterwaarden

pWnd
Verwijst naar het venster dat u wilt herstellen.

Example

Zie het voorbeeld voor CMDIChildWnd::MDIRestore.

CMDIFrameWnd::MDISetMenu

Vervangt het menu van een MDI-framevenster, het snelmenu Venster of beide.

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

Parameterwaarden

pFrameMenu
Hiermee geeft u het menu van het nieuwe frame-venster menu. Als NULL is, wordt het menu niet gewijzigd.

pWindowMenu
Hiermee geeft u het menu van het nieuwe venster pop-upmenu. Als NULL is, wordt het menu niet gewijzigd.

Retourwaarde

Een aanwijzer naar het menu framevenster vervangen door dit bericht. De aanwijzer kan tijdelijk zijn en mag niet worden opgeslagen voor later gebruik.

Opmerkingen

Na het aanroepen MDISetMenumoet een toepassing de lidfunctie DrawMenuBar aanroepen om CWnd de menubalk bij te werken.

Als deze aanroep het snelmenu Venster vervangt, worden de menu-items van het onderliggende venster van MDI verwijderd uit het vorige venstermenu en toegevoegd aan het nieuwe pop-upmenu Venster.

Als een onderliggend MDI-venster is gemaximaliseerd en deze aanroep het menu MDI-framevenster vervangt, worden het besturingselementen voor het besturingselement en de besturingselementen voor herstellen verwijderd uit het vorige framevenstermenu en toegevoegd aan het nieuwe menu.

Roep deze lidfunctie niet aan als u het framework gebruikt om uw MDI-onderliggende vensters te beheren.

Example

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

Rangschikt alle onderliggende vensters in een betegelde indeling.

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

Parameterwaarden

nType
Hiermee geeft u een tegelvlag. Deze parameter kan een van de volgende vlaggen zijn:

  • MDITILE_HORIZONTAL onderliggende vensters van MDI tegels, zodat het ene venster boven het andere venster wordt weergegeven.

  • MDITILE_SKIPDISABLED Voorkomt dat uitgeschakelde MDI-onderliggende vensters worden betegeld.

  • MDITILE_VERTICAL onderliggende vensters van MDI tegels, zodat het ene venster naast het andere venster wordt weergegeven.

Opmerkingen

De eerste versie van MDITile, zonder parameters, tegels de vensters verticaal onder Windows versie 3.1 en hoger. De tweede versietegels worden verticaal of horizontaal weergegeven, afhankelijk van de waarde van de parameter nType .

Example

Zie het voorbeeld voor CMDIFrameWnd::MDICascade.

Zie ook

MFC-voorbeeld MDI
MFC-voorbeeld MDIDOCVW
MFC-voorbeeld SNAPVW
CFrameWnd-klasse
Hiƫrarchiegrafiek
CWnd-klasse
CMDIChildWnd-klasse