Klasa CMDIFrameWnd

Udostępnia funkcje okna ramowego z wieloma dokumentami (MDI) systemu Windows wraz z członkami do zarządzania oknem.

Składnia

class CMDIFrameWnd : public CFrameWnd

Członkowie

Konstruktory publiczne

Nazwa/nazwisko opis
CMDIFrameWnd::CMDIFrameWnd Tworzy element CMDIFrameWnd.

Metody publiczne

Nazwa/nazwisko opis
CMDIFrameWnd::CreateClient Tworzy okno MDICLIENT systemu Windows dla tego CMDIFrameWndelementu . Wywoływana przez funkcję składową OnCreate funkcji CWnd.
CMDIFrameWnd::CreateNewChild Tworzy nowe okno podrzędne.
CMDIFrameWnd::GetWindowMenuPopup Zwraca menu podręczne Okno.
CMDIFrameWnd::MDIActivate Aktywuje inne okno podrzędne MDI.
CMDIFrameWnd::MDICascade Rozmieszcza wszystkie okna podrzędne w formacie kaskadowym.
CMDIFrameWnd::MDIGetActive Pobiera aktualnie aktywne okno podrzędne MDI wraz z flagą wskazującą, czy element podrzędny jest zmaksymalizowany.
CMDIFrameWnd::MDIIconArrange Rozmieszcza wszystkie zminimalizowane okna podrzędne dokumentu.
CMDIFrameWnd::MDIMaximize Maksymalizuje okno podrzędne MDI.
CMDIFrameWnd::MDINext Aktywuje okno podrzędne bezpośrednio za aktualnie aktywnym oknem podrzędnym i umieszcza obecnie aktywne okno podrzędne za wszystkimi innymi oknami podrzędnymi.
CMDIFrameWnd::MDIPrev Aktywuje poprzednie okno podrzędne i umieszcza obecnie aktywne okno podrzędne bezpośrednio za nim.
CMDIFrameWnd::MDIRestore Przywraca okno podrzędne MDI z zmaksymalizowanego lub zminimalizowanego rozmiaru.
CMDIFrameWnd::MDISetMenu Zamienia menu okna ramki MDI, menu podręczne okno okna lub oba te opcje.
CMDIFrameWnd::MDITile Rozmieszcza wszystkie okna podrzędne w formacie kafelków.

Uwagi

Aby utworzyć przydatne okno ramki MDI dla aplikacji, utwórz klasę z klasy CMDIFrameWnd. Dodaj zmienne składowe do klasy pochodnej, aby przechowywać dane specyficzne dla aplikacji. Zaimplementuj funkcje składowe programu obsługi komunikatów i mapę komunikatów w klasie pochodnej, aby określić, co się stanie, gdy komunikaty są kierowane do okna.

Okno ramki MDI można utworzyć, wywołując funkcję składową Create lub LoadFrame .CFrameWnd

Przed wywołaniem Create metody lub LoadFramenależy skonstruować obiekt okna ramowego na stercie przy użyciu operatora C++ new . Przed wywołaniem Create można również zarejestrować klasę okien za pomocą funkcji globalnej AfxRegisterWndClass , aby ustawić ikonę i style klas dla ramki.

Użyj funkcji składowej Create , aby przekazać parametry tworzenia ramki jako argumenty natychmiastowe.

LoadFramewymaga mniejszej liczby argumentów niż Create, a zamiast tego pobiera większość wartości domyślnych z zasobów, w tym podpis ramki, ikonę, tabelę akceleratora i menu. Aby można było uzyskać dostęp do usługi LoadFrame, wszystkie te zasoby muszą mieć ten sam identyfikator zasobu (na przykład IDR_MAINFRAME).

Chociaż MDIFrameWnd pochodzi z CFrameWndklasy , klasa okien ramowych pochodząca z CMDIFrameWnd klasy nie musi być zadeklarowana za pomocą DECLARE_DYNCREATEpolecenia .

Klasa CMDIFrameWnd dziedziczy znaczną część domyślnej implementacji z klasy CFrameWnd. Aby uzyskać szczegółową listę tych funkcji, zapoznaj się z opisem klasy CFrameWnd . Klasa CMDIFrameWnd ma następujące dodatkowe funkcje:

  • Okno ramki MDI zarządza oknem MDICLIENT i zmienia jego położenie w połączeniu z paskami sterowania. Okno klienta MDI jest bezpośrednim elementem nadrzędnym okien ramek podrzędnych MDI. Style okien WS_HSCROLL i WS_VSCROLL określone w CMDIFrameWnd oknie klienta MDI, a nie w głównym oknie ramowym, aby użytkownik mógł przewijać obszar klienta MDI (jak na przykład w Menedżerze programów systemu Windows).

  • Okno ramki MDI jest właścicielem domyślnego menu, które jest używane jako pasek menu, gdy nie ma aktywnego okna podrzędnego MDI. Gdy istnieje aktywny element podrzędny MDI, pasek menu okna ramki MDI jest automatycznie zastępowany przez menu okna podrzędnego MDI.

  • Okno ramki MDI działa w połączeniu z bieżącym oknem podrzędnym MDI, jeśli istnieje. Na przykład komunikaty poleceń są delegowane do aktualnie aktywnego podrzędnego mdI przed oknem ramki MDI.

  • Okno ramki MDI ma domyślne programy obsługi dla następujących standardowych poleceń menu okna:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Okno ramki MDI zawiera również implementację ID_WINDOW_NEW, która tworzy nową ramkę i widok w bieżącym dokumencie. Aplikacja może zastąpić te domyślne implementacje poleceń, aby dostosować obsługę okien MDI.

Nie należy używać operatora C++ delete , aby zniszczyć okno ramki. Użycie w zamian parametru CWnd::DestroyWindow. Implementacja CFrameWndPostNcDestroy spowoduje usunięcie obiektu C++, gdy okno zostanie zniszczone. Gdy użytkownik zamknie okno ramki, domyślna OnClose procedura obsługi wywoła metodę DestroyWindow.

Aby uzyskać więcej informacji na temat CMDIFrameWndprogramu , zobacz Frame Windows (Okna ramek).

Hierarchia dziedziczenia

Cobject

Ccmdtarget

Cwnd

Cframewnd

CMDIFrameWnd

Wymagania

Nagłówek: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

CMDIFrameWnd Tworzy obiekt.

CMDIFrameWnd();

Uwagi

Wywołaj funkcję lub LoadFrame składową, Create aby utworzyć widoczne okno ramki MDI.

Przykład

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

Tworzy okno klienta MDI, które zarządza CMDIChildWnd obiektami.

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

Parametry

lpCreate, struktura
Długi wskaźnik do struktury CREATESTRUCT .

pWindowMenu
Wskaźnik do menu podręcznego Okno.

Wartość zwracana

Bezzerowe, jeśli się powiedzie; w przeciwnym razie 0.

Uwagi

Ta funkcja składowa powinna być wywoływana, jeśli bezpośrednio zastąpisz funkcję składową OnCreate .

Przykład

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

Tworzy nowe okno podrzędne.

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

Parametry

pClass
Klasa czasu wykonywania okna podrzędnego do utworzenia.

nResource
Identyfikator udostępnionych zasobów skojarzonych z oknem podrzędnym.

Hmenu
Menu okna podrzędnego.

hAccel
Akcelerator okna podrzędnego.

Uwagi

Użyj tej funkcji, aby utworzyć podrzędne okna okna ramki MDI.

Przykład

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

Wywołaj tę funkcję składową, aby uzyskać dojście do bieżącego menu podręcznego o nazwie "Okno" (menu podręczne z elementami menu do zarządzania oknem MDI).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Parametry

hMenuBar
Bieżący pasek menu.

Wartość zwracana

Menu podręczne Okno, jeśli istnieje; w przeciwnym razie wartość NULL.

Uwagi

Domyślna implementacja szuka menu podręcznego zawierającego standardowe polecenia menu okna, takie jak ID_WINDOW_NEW i ID_WINDOW_TILE_HORZ.

Zastąpi tę funkcję składową, jeśli masz menu Okno, które nie korzysta ze standardowych identyfikatorów poleceń menu.

Przykład

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

Aktywuje inne okno podrzędne MDI.

void MDIActivate(CWnd* pWndActivate);

Parametry

pWndActivate
Wskazuje okno podrzędne MDI, które ma zostać aktywowane.

Uwagi

Ta funkcja składowa wysyła komunikat WM_MDIACTIVATE zarówno do aktywowanego okna podrzędnego, jak i dezaktywowanego okna podrzędnego.

Jest to ten sam komunikat, który jest wysyłany, jeśli użytkownik zmieni fokus na okno podrzędne MDI przy użyciu myszy lub klawiatury.

Uwaga

Okno podrzędne MDI jest aktywowane niezależnie od okna ramki MDI. Gdy ramka stanie się aktywna, okno podrzędne, które zostało ostatnio aktywowane, jest wysyłane komunikat WM_NCACTIVATE, aby narysować aktywną ramkę okna i pasek podpis, ale nie otrzymuje innego komunikatu WM_MDIACTIVATE.

Przykład

Zobacz przykład polecenia CMDIFrameWnd::GetWindowMenuPopup.

CMDIFrameWnd::MDICascade

Rozmieszcza wszystkie okna podrzędne MDI w formacie kaskadowym.

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

Parametry

nType
Określa flagę kaskadową. Można określić tylko następującą flagę: MDITILE_SKIPDISABLED, co uniemożliwia kaskadowe wyświetlanie wyłączonych okien podrzędnych MDI.

Uwagi

Pierwsza wersja programu MDICascade, bez parametrów, kaskadowo wszystkie okna podrzędne MDI, w tym wyłączone. Druga wersja opcjonalnie nie powoduje kaskadowego wyłączenia okien podrzędnych MDI, jeśli określisz MDITILE_SKIPDISABLED parametru nType .

Przykład

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

Pobiera bieżące aktywne okno podrzędne MDI wraz z flagą wskazującą, czy okno podrzędne jest zmaksymalizowane.

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

Parametry

pbMaximized
Wskaźnik do wartości zwracanej przez wartość BOOL. Ustaw wartość TRUE po powrocie, jeśli okno jest zmaksymalizowane; w przeciwnym razie FAŁSZ.

Wartość zwracana

Wskaźnik do aktywnego okna podrzędnego MDI.

Przykład

Zobacz przykład cmDIChildWnd ::MDIMaximize.

CMDIFrameWnd::MDIIconArrange

Rozmieszcza wszystkie zminimalizowane okna podrzędne dokumentu.

void MDIIconArrange();

Uwagi

Nie ma to wpływu na okna podrzędne, które nie są zminimalizowane.

Przykład

Zobacz przykład cmDIFrameWnd::MDICascade.

CMDIFrameWnd::MDIMaximize

Maksymalizuje określone okno podrzędne MDI.

void MDIMaximize(CWnd* pWnd);

Parametry

Pwnd
Wskazuje okno, aby zmaksymalizować.

Uwagi

Gdy okno podrzędne jest zmaksymalizowane, system Windows zmienia jego rozmiar, aby obszar klienta wypełniał okno klienta. System Windows umieszcza menu Kontrolka okna podrzędnego na pasku menu ramki, aby użytkownik mógł przywrócić lub zamknąć okno podrzędne. Dodaje również tytuł okna podrzędnego do tytułu okna ramowego.

Jeśli jest aktywowane inne okno podrzędne MDI, gdy obecnie aktywne okno podrzędne MDI jest zmaksymalizowane, system Windows przywraca aktualnie aktywne dziecko i maksymalizuje nowo aktywowane okno podrzędne.

Przykład

Zobacz przykład cmDIChildWnd ::MDIMaximize.

CMDIFrameWnd::MDINext

Aktywuje okno podrzędne bezpośrednio za aktualnie aktywnym oknem podrzędnym i umieszcza obecnie aktywne okno podrzędne za wszystkimi innymi oknami podrzędnymi.

void MDINext();

Uwagi

Jeśli obecnie aktywne okno podrzędne MDI jest zmaksymalizowane, funkcja składowa przywraca aktualnie aktywne dziecko i maksymalizuje nowo aktywowane dziecko.

Przykład

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

Aktywuje poprzednie okno podrzędne i umieszcza obecnie aktywne okno podrzędne bezpośrednio za nim.

void MDIPrev();

Uwagi

Jeśli obecnie aktywne okno podrzędne MDI jest zmaksymalizowane, funkcja składowa przywraca aktualnie aktywne dziecko i maksymalizuje nowo aktywowane dziecko.

CMDIFrameWnd::MDIRestore

Przywraca okno podrzędne MDI z zmaksymalizowanego lub zminimalizowanego rozmiaru.

void MDIRestore(CWnd* pWnd);

Parametry

Pwnd
Wskazuje okno do przywrócenia.

Przykład

Zobacz przykład dla polecenia CMDIChildWnd::MDIRestore.

CMDIFrameWnd::MDISetMenu

Zamienia menu okna ramki MDI, menu podręczne okno okna lub oba te opcje.

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

Parametry

pFrameMenu
Określa menu nowego menu okna ramki. Jeśli wartość NULL, menu nie zostanie zmienione.

pWindowMenu
Określa menu menu podręcznego nowego okna. Jeśli wartość NULL, menu nie zostanie zmienione.

Wartość zwracana

Wskaźnik do menu okna ramki zastąpiony przez ten komunikat. Wskaźnik może być tymczasowy i nie powinien być przechowywany do późniejszego użycia.

Uwagi

Po wywołaniu MDISetMenumetody aplikacja musi wywołać funkcję składową DrawMenuBar , CWnd aby zaktualizować pasek menu.

Jeśli to wywołanie zastępuje menu podręczne Okno, elementy menu podrzędnego MDI zostaną usunięte z poprzedniego menu Okno i dodane do nowego menu podręcznego Okno.

Jeśli okno podrzędne MDI jest zmaksymalizowane i to wywołanie zastępuje menu okna ramki MDI, kontrolki Menu sterowania i przywracania zostaną usunięte z poprzedniego menu okna ramki i dodane do nowego menu.

Nie należy wywoływać tej funkcji składowej, jeśli używasz platformy do zarządzania oknami podrzędnym MDI.

Przykład

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

Rozmieszcza wszystkie okna podrzędne w formacie kafelków.

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

Parametry

nType
Określa flagę tilinga. Ten parametr może być jedną z następujących flag:

  • MDITILE_HORIZONTAL kafelków okna podrzędne MDI, aby jedno okno było wyświetlane powyżej drugiego.

  • MDITILE_SKIPDISABLED Uniemożliwia kafelki wyłączonych okien podrzędnych MDI.

  • MDITILE_VERTICAL kafelki okna podrzędne MDI, aby jedno okno było wyświetlane obok drugiego.

Uwagi

Pierwsza wersja programu MDITile, bez parametrów, kafelkuje okna w pionie w systemie Windows w wersji 3.1 lub nowszej. Druga wersja kafelków okna w pionie lub w poziomie, w zależności od wartości parametru nType .

Przykład

Zobacz przykład cmDIFrameWnd::MDICascade.

Zobacz też

Przykładowe mdI MFC
Przykład MFC MDIDOCVW
Przykład MFC SNAPVW
Klasa CFrameWnd
Wykres hierarchii
Klasa CWnd
Klasa CMDIChildWnd