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
Název | Popis |
---|---|
CMDIFrameWnd::CMDIFrameWnd | Vytvoří .CMDIFrameWnd |
Veřejné metody
Název | Popis |
---|---|
CMDIFrameWnd::CreateClient | Vytvoří pro toto CMDIFrameWnd okno 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 LoadFrame
je 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ů.
LoadFrame
vyžaduje méně argumentů než Create
a místo toho načte většinu výchozích hodnot z prostředků, včetně titulku rámečku, ikony, tabulky akcelerátoru a nabídky. Pro přístup ke všem těmto prostředkům LoadFrame
musí 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 CMDIFrameWnd
tématu Rámová okna.
Hierarchie dědičnosti
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.
Návratová 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.
Návratová 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ámec aktivuje, podřízené okno, které bylo naposledy aktivováno, se odešle WM_NCACTIVATE zpráva, která nakreslela aktivní rámeček okna a řádek titulků, 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.
Návratová 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í.
Návratová 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í MDISetMenu
aplikace 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