Megosztás a következőn keresztül:


CMDIFrameWnd osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

A Windows több dokumentumfelületet (MDI) tartalmazó keretablak funkcióit, valamint az ablak kezeléséhez szükséges tagokat biztosítja.

Szemantika

class CMDIFrameWnd : public CFrameWnd

Tagok

Nyilvános konstruktorok

Név Description
CMDIFrameWnd::CMDIFrameWnd Létrehoz egy CMDIFrameWnd-t.

Nyilvános metódusok

Név Description
CMDIFrameWnd::CreateClient Ehhez létrehoz egy Windows MDICLIENT-ablakot CMDIFrameWnd. A függvény tagfüggvénye CWndhívja OnCreate meg.
CMDIFrameWnd::CreateNewChild Új gyermekablakot hoz létre.
CMDIFrameWnd::GetWindowMenuPopup Az Ablak előugró menüt adja vissza.
CMDIFrameWnd::MDIActivate Egy másik MDI gyermekablak aktiválása.
CMDIFrameWnd::MDICascade Az összes gyermekablakot kaszkádolt formátumban rendezi el.
CMDIFrameWnd::MDIGetActive Lekéri a jelenleg aktív MDI gyermekablakot, valamint egy jelölőt, amely jelzi, hogy a gyermek teljes méretű-e.
CMDIFrameWnd::MDIIconArrange Az összes kisméretű dokumentum gyermekablakát elrendezi.
CMDIFrameWnd::MDIMaximize Az MDI gyermekablakának maximalizálása.
CMDIFrameWnd::MDINext Aktiválja a gyermekablakot közvetlenül az aktuálisan aktív gyermekablak mögött, és az aktuálisan aktív gyermekablakot az összes többi gyermekablak mögé helyezi.
CMDIFrameWnd::MDIPrev Aktiválja az előző gyermekablakot, és közvetlenül mögé helyezi az aktuálisan aktív gyermekablakot.
CMDIFrameWnd::MDIRestore Visszaállít egy MDI gyermekablakot a teljes vagy a minimális méretből.
CMDIFrameWnd::MDISetMenu Lecseréli az MDI-keretablak, az Ablak előugró menü vagy mindkettő menüjét.
CMDIFrameWnd::MDITile Csempézett formátumban rendezi el az összes gyermekablakot.

Megjegyzések

Ha hasznos MDI-keretablakot szeretne létrehozni az alkalmazáshoz, hozzon létre egy osztályt a következőből CMDIFrameWnd: . Tagváltozók hozzáadása a származtatott osztályhoz az alkalmazásra jellemző adatok tárolásához. Üzenetkezelő tagfüggvények és üzenettérkép implementálása a származtatott osztályban annak meghatározásához, hogy mi történik, amikor az üzeneteket az ablakba irányítják.

MDI-keretablakot úgy hozhat létre, hogy meghívja a Create vagy LoadFrame tag függvényt CFrameWnd.

A hívás Create előtt vagy LoadFramea C++ new operátorral kell létrehoznia a keretablak-objektumot a halomra. A hívás Create előtt regisztrálhat egy ablakosztályt az AfxRegisterWndClass globális függvénnyel a keret ikonjának és osztálystílusainak beállításához.

Create A tagfüggvény használatával azonnali argumentumként adja át a keret létrehozási paramétereit.

LoadFrame kevesebb argumentumot igényel, mint Createa , és ehelyett lekéri az alapértelmezett értékek többségét az erőforrásokból, beleértve a keret feliratát, ikonját, gyorsítótábláját és menüjét. A hozzáféréshez LoadFramemindegyik erőforrásnak ugyanazzal az erőforrás-azonosítóval kell rendelkeznie (például IDR_MAINFRAME).

Bár MDIFrameWnd származik CFrameWnd, a keretablak osztály származtatott CMDIFrameWnd nem kell deklarálni a DECLARE_DYNCREATE.

Az CMDIFrameWnd osztály az alapértelmezett implementáció nagy részét a következőtől CFrameWndörökli: . A funkciók részletes listáját a CFrameWnd osztály leírásában találja. Az CMDIFrameWnd osztály a következő további funkciókkal rendelkezik:

  • Az MDI-keretablak kezeli az MDICLIENT ablakot, és a vezérlősávokkal együtt áthelyezi. Az MDI-ügyfélablak az MDI gyermekkeretablakainak közvetlen szülője. A WS_HSCROLL és WS_VSCROLL ablakstílusok az MDI-ügyfélablakra CMDIFrameWnd vonatkoznak a fő keretablak helyett, hogy a felhasználó görgethesse az MDI-ügyfélterületet (például a Windows Program Managerben).

  • Az MDI-keretablakok alapértelmezett menüt használnak menüsávként, ha nincs aktív MDI gyermekablak. Aktív MDI-gyermek esetén az MDI-keretablak menüsávját automatikusan felváltja az MDI gyermekablak menüje.

  • Az MDI-keretablak az aktuális MDI gyermekablakkal együtt működik, ha van ilyen. A parancsüzenetek például az MDI-keretablak előtt delegálva lesznek a jelenleg aktív MDI-gyermek számára.

  • Az MDI-keretablakok alapértelmezett kezelői a következő szabványos Ablak menüparancsokhoz vannak beállítva:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Az MDI-keretablak ID_WINDOW_NEW implementációval is rendelkezik, amely új keretet és nézetet hoz létre az aktuális dokumentumon. Az alkalmazások felülbírálhatják ezeket az alapértelmezett parancsmegvalósításokat az MDI-ablakkezelés testreszabásához.

Ne használja a C++ delete operátort a keretablak elpusztításához. A CWnd::DestroyWindow használható helyette. A CFrameWnd végrehajtás PostNcDestroy törli a C++ objektumot, amikor az ablak megsemmisül. Amikor a felhasználó bezárja a keretablakot, az alapértelmezett OnClose kezelő fog hívni DestroyWindow.

További információ: CMDIFrameWndKeretablakok.

Öröklési hierarchia

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

Requirements

Fejléc: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

Egy CMDIFrameWnd objektumot hoz létre.

CMDIFrameWnd();

Megjegyzések

Hívja meg a vagy LoadFrame tag Create függvényt a látható MDI-keretablak létrehozásához.

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

Létrehozza az objektumokat kezelő MDI-ügyfélablakot CMDIChildWnd .

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

Paraméterek

lpCreateStruct
Hosszú mutató a CREATESTRUCT-struktúra felé .

pWindowMenu
Mutató az Ablak előugró menüre.

Visszaadott érték

Nonzero, ha sikeres; egyéb esetben 0.

Megjegyzések

Ezt a tagfüggvényt akkor kell meghívni, ha közvetlenül felülbírálja a tagfüggvényt OnCreate .

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

Új gyermekablakot hoz létre.

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

Paraméterek

pClass
A létrehozandó gyermekablak futásidejű osztálya.

nResource
A gyermekablakhoz társított megosztott erőforrások azonosítója.

hMenu
A gyermekablak menüje.

hAccel
A gyermekablak gázpedálja.

Megjegyzések

Ezzel a függvénnyel gyermekablakokat hozhat létre egy MDI-keretablakból.

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

Hívja meg ezt a tagfüggvényt, hogy lekérte az aktuális előugró menü "Ablak" nevű leíróját (az előugró menüt az MDI-ablakkezelés menüelemeivel).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Paraméterek

hMenuBar
Az aktuális menüsáv.

Visszaadott érték

Az Ablak előugró menü, ha létezik; ellenkező esetben NULL.

Megjegyzések

Az alapértelmezett implementáció olyan előugró menüt keres, amely szabványos Ablak menüparancsokat tartalmaz, például ID_WINDOW_NEW és ID_WINDOW_TILE_HORZ.

Bírálja felül ezt a tagfüggvényt, ha olyan Ablak menüvel rendelkezik, amely nem használja a standard menüparancs azonosítóit.

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

Egy másik MDI gyermekablak aktiválása.

void MDIActivate(CWnd* pWndActivate);

Paraméterek

pWndActivate
Az aktiválandó MDI gyermekablakra mutat.

Megjegyzések

Ez a tagfüggvény elküldi a WM_MDIACTIVATE üzenetet az aktivált gyermekablaknak és az inaktivált gyermekablaknak is.

Ez ugyanaz az üzenet, amelyet akkor küld a rendszer, ha a felhasználó az egér vagy a billentyűzet használatával MDI gyermekablakra helyezi a fókuszt.

Megjegyzés:

Az MDI gyermekablak az MDI keretablakától függetlenül aktiválódik. Amikor a keret aktívvá válik, a legutóbb aktivált gyermekablak WM_NCACTIVATE üzenetet kap egy aktív ablakkeret és feliratsáv rajzolásához, de nem kap újabb WM_MDIACTIVATE üzenetet.

Example

Lásd a CMDIFrameWnd::GetWindowMenuPopup példát.

CMDIFrameWnd::MDICascade

Az MDI gyermekablakait kaszkádolt formátumban rendezi el.

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

Paraméterek

nType
Kaszkádolt jelölőt ad meg. Csak a következő jelölő adható meg: MDITILE_SKIPDISABLED, amely megakadályozza, hogy a letiltott MDI-gyermekablakok kaszkádoltak legyenek.

Megjegyzések

Az első verzió MDICascadeparaméterek nélkül kaszkádolt minden MDI-gyermekablakot, beleértve a letiltott ablakokat is. A második verzió opcionálisan nem kaszkádozza a letiltott MDI gyermekablakokat, ha MDITILE_SKIPDISABLED az nType paraméterhez.

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

Lekéri az aktuális aktív MDI gyermekablakot, valamint egy jelzőt, amely jelzi, hogy a gyermekablak teljes méretű-e.

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

Paraméterek

pbMaximized
A BOOL visszatérési értékére mutató mutató. Igaz értékre állítsa vissza, ha az ablak teljes méretű; egyéb esetben HAMIS.

Visszaadott érték

Mutató az aktív MDI gyermekablakra.

Example

Lásd a CMDIChildWnd::MDIMaximize példát.

CMDIFrameWnd::MDIIconArrange

Az összes kisméretű dokumentum gyermekablakát elrendezi.

void MDIIconArrange();

Megjegyzések

Ez nem érinti a nem kis méretű gyermekablakokat.

Example

Lásd a CMDIFrameWnd::MDICascade példát.

CMDIFrameWnd::MDIMaximize

Maximalizálja a megadott MDI gyermekablakot.

void MDIMaximize(CWnd* pWnd);

Paraméterek

pWnd
A teljes méret érdekében az ablakra mutat.

Megjegyzések

Ha egy gyermekablak teljes méretű, a Windows átméretezi, hogy az ügyfélterülete kitöltse az ügyfélablakot. A Windows a gyermekablak Vezérlő menüjét helyezi el a keret menüsávján, hogy a felhasználó visszaállíthassa vagy bezárhassa a gyermekablakot. Emellett hozzáadja a gyermekablak címét a keretablak címéhez.

Ha a jelenleg aktív MDI gyermekablak maximalizálásakor egy másik MDI gyermekablak aktiválódik, a Windows visszaállítja a jelenleg aktív gyermekablakot, és maximalizálja az újonnan aktivált gyermekablakot.

Example

Lásd a CMDIChildWnd::MDIMaximize példát.

CMDIFrameWnd::MDINext

Aktiválja a gyermekablakot közvetlenül az aktuálisan aktív gyermekablak mögött, és az aktuálisan aktív gyermekablakot az összes többi gyermekablak mögé helyezi.

void MDINext();

Megjegyzések

Ha a jelenleg aktív MDI gyermekablak teljes méretű, a tagfüggvény visszaállítja a jelenleg aktív gyermeket, és maximalizálja az újonnan aktivált gyermeket.

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

Aktiválja az előző gyermekablakot, és közvetlenül mögé helyezi az aktuálisan aktív gyermekablakot.

void MDIPrev();

Megjegyzések

Ha a jelenleg aktív MDI gyermekablak teljes méretű, a tagfüggvény visszaállítja a jelenleg aktív gyermeket, és maximalizálja az újonnan aktivált gyermeket.

CMDIFrameWnd::MDIRestore

Visszaállít egy MDI gyermekablakot a teljes vagy a minimális méretből.

void MDIRestore(CWnd* pWnd);

Paraméterek

pWnd
A visszaállítandó ablakra mutat.

Example

Lásd a CMDIChildWnd::MDIRestore példát.

CMDIFrameWnd::MDISetMenu

Lecseréli az MDI-keretablak, az Ablak előugró menü vagy mindkettő menüjét.

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

Paraméterek

pFrameMenu
Az új keretablak menüjét adja meg. Null érték esetén a menü nem módosul.

pWindowMenu
Az új ablak előugró menüjének menüje. Null érték esetén a menü nem módosul.

Visszaadott érték

Ez az üzenet a keretablak menüjére mutató mutató. Előfordulhat, hogy a mutató ideiglenes, és nem tárolható későbbi használatra.

Megjegyzések

A hívás MDISetMenuután az alkalmazásnak meg kell hívnia a DrawMenuBar tagfüggvényt a menüsáv frissítéséhez CWnd .

Ha ez a hívás lecseréli az Ablak előugró menüt, az MDI gyermekablak menüelemei törlődnek az előző Ablak menüből, és hozzáadódnak az új Ablak előugró menühöz.

Ha az MDI gyermekablaka teljes méretű, és ez a hívás lecseréli az MDI keretablak menüjét, a Vezérlő menü és a Visszaállítás vezérlők törlődnek az előző keretablak menüből, és hozzáadódnak az új menühöz.

Ne hívja meg ezt a tagfüggvényt, ha a keretrendszert használja az MDI gyermekablakainak kezeléséhez.

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

Csempézett formátumban rendezi el az összes gyermekablakot.

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

Paraméterek

nType
Egy burkoló jelölőt ad meg. Ez a paraméter a következő jelzők bármelyike lehet:

  • MDITILE_HORIZONTAL Csempék MDI gyermekablakai, hogy az egyik ablak megjelenjen a másik felett.

  • MDITILE_SKIPDISABLED Megakadályozza, hogy a letiltott MDI-gyermekablakok csempézve legyenek.

  • MDITILE_VERTICAL Csempék MDI gyermekablakai, hogy az egyik ablak a másik mellett jelenjen meg.

Megjegyzések

A paraméterek nélküli első verzió MDITilefüggőlegesen csempézi az ablakokat a Windows 3.1-es és újabb verziói alá. A második verzió az nType paraméter értékétől függően függőlegesen vagy vízszintesen csempéz ablakokat.

Example

Lásd a CMDIFrameWnd::MDICascade példát.

Lásd még

MFC-minta MDI
MFC-minta MDIDOCVW
MFC-minta SNAPVW
CFrameWnd osztály
hierarchiadiagram
CWnd osztály
CMDIChildWnd osztály