Sdílet prostřednictvím


CMDIFrameWnd – třída

Poskytuje funkce okna s rámečkem s více rozhraními dokumentů (MDI) systému Windows a členy pro správu okna.

Syntaxe

class CMDIFrameWnd : public CFrameWnd

Členové

Veřejné konstruktory

Jméno popis
CMDIFrameWnd::CMDIFrameWnd Vytvoří .CMDIFrameWnd

Veřejné metody

Jméno popis
CMDIFrameWnd::CreateClient Vytvoří pro toto CMDIFrameWndokno Windows MDICLIENT . Volal by OnCreate člen funkce CWnd.
CMDIFrameWnd::CreateNewChild Vytvoří nové podřízené okno.
CMDIFrameWnd::GetWindowMenuPopup Vrátí místní nabídku Okno.
CMDIFrameWnd::MDIActivate Aktivuje jiné podřízené okno MDI.
CMDIFrameWnd::MDICascade Uspořádá všechna podřízená okna v kaskádovém formátu.
CMDIFrameWnd::MDIGetActive Načte aktuálně aktivní podřízené okno MDI spolu s příznakem označujícím, zda je podřízená položka maximalizována.
CMDIFrameWnd::MDIIconArrange Uspořádá všechna minimalizovaná podřízená okna dokumentu.
CMDIFrameWnd::MDIMaximize Maximalizuje podřízené okno MDI.
CMDIFrameWnd::MDINext Aktivuje podřízené okno bezprostředně za aktuálně aktivním podřízeným oknem a umístí aktuálně aktivní podřízené okno za všechna ostatní podřízená okna.
CMDIFrameWnd::MDIPrev Aktivuje předchozí podřízené okno a umístí aktuálně aktivní podřízené okno hned za ním.
CMDIFrameWnd::MDIRestore Obnoví podřízené okno MDI z maximalizované nebo minimalizované velikosti.
CMDIFrameWnd::MDISetMenu Nahradí nabídku okna rámce MDI, místní nabídky Okna nebo obojí.
CMDIFrameWnd::MDITile Uspořádá všechna podřízená okna v dlaždicovém formátu.

Poznámky

Chcete-li vytvořit užitečné okno rámce MDI pro vaši aplikaci, odvodit třídu z CMDIFrameWnd. Přidejte do odvozené třídy členské proměnné pro ukládání dat specifických pro vaši aplikaci. Implementujte členské funkce obslužné rutiny zpráv a mapu zpráv v odvozené třídě a určete, co se stane, když jsou zprávy směrovány do okna.

Okno rámce MDI můžete vytvořit voláním členské funkce Create nebo LoadFrame .CFrameWnd

Před voláním Create nebo LoadFrameje nutné vytvořit objekt okna rámce v haldě pomocí operátoru C++ new . Před voláním Create můžete také zaregistrovat třídu okna s globální funkcí AfxRegisterWndClass , která nastaví ikonu a styly tříd pro rámec.

Create Členské funkce slouží k předání parametrů vytvoření rámce jako okamžitých argumentů.

LoadFramevyžaduje méně argumentů než Createa místo toho načte většinu výchozích hodnot z prostředků, včetně popis rámce, ikony, tabulky akcelerátoru a nabídky. Pro přístup ke všem těmto prostředkům LoadFramemusí mít stejné ID prostředku (například IDR_MAINFRAME).

I když MDIFrameWnd je odvozena z CFrameWnd, třída okna rámečku odvozená z CMDIFrameWnd nemusí být deklarována s DECLARE_DYNCREATE.

Třída CMDIFrameWnd dědí většinu své výchozí implementace z CFrameWnd. Podrobný seznam těchto funkcí naleznete v popisu třídy CFrameWnd . Třída CMDIFrameWnd má následující další funkce:

  • Okno rámce MDI spravuje okno MDICLIENT a přemísťuje ho ve spojení s řídicími pruhy. Klientské okno MDI je přímým nadřazenou nadřazenou rámečekem MDI podřízených oken. Styly oken WS_HSCROLL a WS_VSCROLL zadané v klientském CMDIFrameWnd okně MDI, nikoli v okně hlavního rámce, aby se uživatel mohl posouvat v oblasti klienta MDI (například ve Správci programu systému Windows).

  • Okno rámce MDI vlastní výchozí nabídku, která se používá jako řádek nabídek, pokud není aktivní podřízené okno MDI. Pokud je aktivní podřízená položka MDI, řádek nabídek okna rámce MDI se automaticky nahradí nabídkou podřízeného okna MDI.

  • Okno rámce MDI funguje ve spojení s aktuálním podřízeným oknem MDI, pokud existuje. Například příkazové zprávy se delegují do aktuálně aktivní podřízené mdI před oknem rámce MDI.

  • Okno rámce MDI obsahuje výchozí obslužné rutiny pro následující standardní příkazy nabídky okna:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Okno rámce MDI má také implementaci ID_WINDOW_NEW, která vytvoří nový rámec a zobrazení aktuálního dokumentu. Aplikace může tyto výchozí implementace příkazů přepsat tak, aby přizpůsobila zpracování oken MDI.

Nepoužívejte operátor C++ delete ke zničení okna rámce. Místo toho použijte CWnd::DestroyWindow. Implementace CFrameWnd PostNcDestroy odstraní objekt C++ při zničení okna. Když uživatel zavře okno rámce, bude výchozí OnClose obslužná rutina volat DestroyWindow.

Další informace naleznete v CMDIFrameWndtématu Rámová okna.

Hierarchie dědičnosti

Objekt CObject

CCmdTarget

Cwnd

CFrameWnd

CMDIFrameWnd

Požadavky

Hlavička: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

CMDIFrameWnd Vytvoří objekt.

CMDIFrameWnd();

Poznámky

Voláním Create nebo LoadFrame členské funkce vytvořte viditelné okno rámce MDI.

Příklad

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

Vytvoří okno klienta MDI, které spravuje CMDIChildWnd objekty.

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

Parametry

lpCreate – struktura
Dlouhý ukazatel na strukturu CREATESTRUCT .

pWindowMenu
Ukazatel na místní nabídku Okno.

Vrácená hodnota

Nenulové, pokud je úspěšné; jinak 0.

Poznámky

Pokud členovou OnCreate funkci přepíšete přímo, měla by se tato členová funkce volat.

Příklad

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

Vytvoří nové podřízené okno.

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

Parametry

pClass
Třída spuštění podřízeného okna, která se má vytvořit.

nResource
ID sdílených prostředků přidružených k podřízeným oknům.

hMenu
Nabídka podřízeného okna.

hAccel
Akcelerátor podřízeného okna.

Poznámky

Tato funkce slouží k vytvoření podřízených oken okna rámce MDI.

Příklad

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

Voláním této členské funkce získáte popisovač aktuální místní nabídky s názvem "Okno" (místní nabídka s položkami nabídky pro správu oken MDI).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Parametry

hMenuBar
Aktuální řádek nabídek.

Vrácená hodnota

Místní nabídka Okno, pokud existuje; jinak NULL.

Poznámky

Výchozí implementace hledá místní nabídku obsahující standardní příkazy nabídky okna, jako jsou ID_WINDOW_NEW a ID_WINDOW_TILE_HORZ.

Tuto členovou funkci přepište, pokud máte nabídku Okna, která nepoužívá ID příkazů standardní nabídky.

Příklad

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

Aktivuje jiné podřízené okno MDI.

void MDIActivate(CWnd* pWndActivate);

Parametry

Funkce pWndActivate
Odkazuje na podřízené okno MDI, které se má aktivovat.

Poznámky

Tato členová funkce odešle WM_MDIACTIVATE zprávu do aktivovaného podřízeného okna i deaktivovaného podřízeného okna.

Jedná se o stejnou zprávu, která se odešle, pokud uživatel změní fokus na podřízené okno MDI pomocí myši nebo klávesnice.

Poznámka

Podřízené okno MDI je aktivováno nezávisle na okně rámce MDI. Když se rámeček aktivuje, podřízené okno, které bylo naposledy aktivováno, se odešle zpráva WM_NCACTIVATE k vykreslení aktivního rámečku okna a popis pruhu, ale neobdrží další WM_MDIACTIVATE zprávu.

Příklad

Podívejte se na příklad pro CMDIFrameWnd::GetWindowMenuPopup.

CMDIFrameWnd::MDICascade

Uspořádá všechna podřízená okna MDI v kaskádovém formátu.

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

Parametry

nType
Určuje kaskádový příznak. Lze zadat pouze následující příznak: MDITILE_SKIPDISABLED, což brání kaskádové okeně MDI.

Poznámky

První verze MDICascade, bez parametrů, kaskáduje všechna podřízená okna MDI, včetně zakázaných. Druhá verze volitelně nezablokuje podřízená okna MDI, pokud pro parametr nType zadáte MDITILE_SKIPDISABLED.

Příklad

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

Načte aktuální aktivní podřízené okno MDI spolu s příznakem označujícím, jestli je podřízené okno maximalizované.

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

Parametry

pbMaximized
Ukazatel na návratovou hodnotu BOOL. Pokud je okno maximalizované, nastavte při vrácení hodnotu PRAVDA; jinak NEPRAVDA.

Vrácená hodnota

Ukazatel na aktivní podřízené okno MDI.

Příklad

Podívejte se na příklad pro CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDIIconArrange

Uspořádá všechna minimalizovaná podřízená okna dokumentu.

void MDIIconArrange();

Poznámky

Nemá vliv na podřízená okna, která nejsou minimalizovaná.

Příklad

Podívejte se na příklad pro CMDIFrameWnd::MDICascade.

CMDIFrameWnd::MDIMaximize

Maximalizuje zadané podřízené okno MDI.

void MDIMaximize(CWnd* pWnd);

Parametry

pWnd
Odkazuje na okno, aby se maximalizovalo.

Poznámky

Když je podřízené okno maximalizované, windows změní jeho velikost tak, aby jeho klientská oblast vyplnila okno klienta. Systém Windows umístí ovládací nabídku podřízeného okna do řádku nabídek rámce, aby uživatel mohl podřízené okno obnovit nebo zavřít. Přidá také název podřízeného okna do názvu okna rámečku.

Pokud je aktivováno další podřízené okno MDI, pokud je aktuálně aktivní podřízené okno MDI maximalizováno, windows obnoví aktuálně aktivní podřízené okno a maximalizuje nově aktivované podřízené okno.

Příklad

Podívejte se na příklad pro CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDINext

Aktivuje podřízené okno bezprostředně za aktuálně aktivním podřízeným oknem a umístí aktuálně aktivní podřízené okno za všechna ostatní podřízená okna.

void MDINext();

Poznámky

Pokud je aktuálně aktivní podřízené okno MDI maximalizované, členské funkce obnoví aktuálně aktivní podřízené okno a maximalizuje nově aktivované podřízené okno.

Příklad

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

Aktivuje předchozí podřízené okno a umístí aktuálně aktivní podřízené okno hned za ním.

void MDIPrev();

Poznámky

Pokud je aktuálně aktivní podřízené okno MDI maximalizované, členské funkce obnoví aktuálně aktivní podřízené okno a maximalizuje nově aktivované podřízené okno.

CMDIFrameWnd::MDIRestore

Obnoví podřízené okno MDI z maximalizované nebo minimalizované velikosti.

void MDIRestore(CWnd* pWnd);

Parametry

pWnd
Odkazuje na okno, které chcete obnovit.

Příklad

Viz příklad pro CMDIChildWnd::MDIRestore.

CMDIFrameWnd::MDISetMenu

Nahradí nabídku okna rámce MDI, místní nabídky Okna nebo obojí.

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

Parametry

pFrameMenu
Určuje nabídku nové nabídky okna s rámečkem. Pokud je hodnota NULL, nabídka se nezmění.

pWindowMenu
Určuje nabídku nové místní nabídky Okna. Pokud je hodnota NULL, nabídka se nezmění.

Vrácená hodnota

Ukazatel na nabídku okna rámečku nahrazenou touto zprávou. Ukazatel může být dočasný a neměl by být uložen pro pozdější použití.

Poznámky

Po volání MDISetMenuaplikace musí volat členovou funkci CWnd DrawMenuBar aktualizovat řádek nabídek.

Pokud toto volání nahradí místní nabídku Okna, položky nabídky podřízené okno MDI se odeberou z předchozí nabídky Okno a přidají se do nové místní nabídky Okno.

Pokud je podřízené okno MDI maximalizované a toto volání nahradí nabídku rámečku MDI, ovládací prvky Control a restore se odeberou z předchozí nabídky okna rámečku a přidají se do nové nabídky.

Tuto členovu funkci nevolejte, pokud ke správě podřízených oken MDI používáte architekturu.

Příklad

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

Uspořádá všechna podřízená okna v dlaždicovém formátu.

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

Parametry

nType
Určuje příznak provazování. Tento parametr může být libovolný z následujících příznaků:

  • MDITILE_HORIZONTAL dlaždice podřízených oken MDI tak, aby se jedno okno zobrazilo nad druhým.

  • MDITILE_SKIPDISABLED Zabrání dlaždici zakázaných podřízených oken MDI.

  • MDITILE_VERTICAL dlaždice MDI podřízená okna tak, aby se jedno okno zobrazilo vedle druhého.

Poznámky

První verze MDITile, bez parametrů, dlaždice okna svisle pod Windows verze 3.1 a novější. Druhá verze dlaždice okna svisle nebo vodorovně v závislosti na hodnotě nType parametru.

Příklad

Podívejte se na příklad pro CMDIFrameWnd::MDICascade.

Viz také

MFC – ukázka MDI
MFC – ukázka MDIDOCVW
MFC – Ukázka SNAPVW
CFrameWnd – třída
Graf hierarchie
CWnd – třída
CMDIChildWnd – třída