Classe CMDIFrameWnd
Fornece a funcionalidade de uma janela de quadro MDI (interface de documento múltiplo) do Windows, além dos membros para gerenciar a janela.
Sintaxe
class CMDIFrameWnd : public CFrameWnd
Membros
Construtores públicos
Nome | Descrição |
---|---|
CMDIFrameWnd::CMDIFrameWnd | Constrói um CMDIFrameWnd . |
Métodos públicos
Nome | Descrição |
---|---|
CMDIFrameWnd::CreateClient | Cria uma janela MDICLIENT do Windows para esse CMDIFrameWnd . Chamado pela função de membro OnCreate de CWnd . |
CMDIFrameWnd::CreateNewChild | Cria uma nova janela filho. |
CMDIFrameWnd::GetWindowMenuPopup | Retorna o menu pop-up do Windows. |
CMDIFrameWnd::MDIActivate | Ativa uma janela filho diferente da MDI. |
CMDIFrameWnd::MDICascade | Organiza todas as janelas filho em cascata. |
CMDIFrameWnd::MDIGetActive | Recupera a janela filho da MDI ativa no momento, juntamente com um sinalizador que indica se o filho está maximizado. |
CMDIFrameWnd::MDIIconArrange | Organiza todas as janelas filho minimizadas do documento. |
CMDIFrameWnd::MDIMaximize | Maximiza uma janela filho da MDI. |
CMDIFrameWnd::MDINext | Ativa a janela filho imediatamente atrás da janela filho ativa no momento e coloca a janela filho ativa no momento atrás de todas as outras janelas filho. |
CMDIFrameWnd::MDIPrev | Ativa a janela filho anterior e coloca a janela filho ativa no momento imediatamente atrás dela. |
CMDIFrameWnd::MDIRestore | Restaura uma janela filho da MDI do tamanho maximizado ou minimizado. |
CMDIFrameWnd::MDISetMenu | Substitui o menu de uma janela com moldura da interface MDI, o menu pop-up do Windows ou ambos. |
CMDIFrameWnd::MDITile | Organiza todas as janelas filho em um formato organizado lado a lado. |
Comentários
Para criar uma janela com moldura útil da interface MDI para o aplicativo, derive uma classe de CMDIFrameWnd
. Adicione variáveis de membro à classe derivada para armazenar os dados específicos do aplicativo. Implemente funções membro do manipulador de mensagens e um mapa de mensagens na classe derivada para especificar o que acontecerá quando as mensagens forem direcionadas para a janela.
Você pode construir uma janela com moldura da interface MDI, chamando a função de membro Criar ou LoadFrame de CFrameWnd
.
Antes de chamar Create
ou LoadFrame
, será necessário construir o objeto de janela com moldura no heap, usando o novo operador new
do C++. Antes de chamar Create
você também poderá registrar uma classe de janela com a função global AfxRegisterWndClass para definir os estilos de ícone e classe para o quadro.
Use a função membro Create
para passar os parâmetros de criação do quadro como argumentos imediatos.
LoadFrame
exige menos argumentos do que Create
e, em vez disso, recupera a maioria dos valores padrão dos recursos incluindo a legenda, o ícone, a tabela de aceleradores e o menu do quadro. Para serem acessados pelo LoadFrame
, todos esses recursos deverão ter a mesma ID do recurso (por exemplo, IDR_MAINFRAME).
Embora MDIFrameWnd
seja derivado de CFrameWnd
, uma classe de janela com moldura derivada de CMDIFrameWnd
não precisa ser declarada com o DECLARE_DYNCREATE
.
A classe CMDIFrameWnd
herda grande parte da implementação padrão do CFrameWnd
. Para obter uma lista detalhada desses recursos, consulte a descrição de classe CFrameWnd. A classe CMDIFrameWnd
tem os seguintes recursos adicionais:
Em uma janela com moldura da interface MDI, a janela com moldura gerencia a janela MDICLIENT, reposicionando-a em conjunto com as barras de controle. A janela cliente da interface MDI é o pai direto das janelas com moldura filho da MDI. Os estilos de janela WS_HSCROLL e WS_VSCROLL especificados em um
CMDIFrameWnd
se aplicam à janela cliente da interface MDI, em vez da janela de mainframe, para que o usuário possa rolar a área do cliente da MDI (como no Gerenciador de Programas do Windows, por exemplo).Uma janela com moldura da interface MDI tem um menu padrão usado como a barra de menus, quando não há janelas filho da MDI ativas. Quando há um filho da interface MDI ativo, a barra de menus da janela com moldura da MDI é substituída automaticamente pelo menu da janela filho da MDI.
Uma janela com moldura da interface MDI funciona em conjunto com a janela filho da MDI atual, se houver. Por exemplo, as mensagens de comando são delegadas para o filho da interface MDI atualmente ativo, antes da janela com moldura da MDI.
Uma janela com moldura da interface MDI tem manipuladores padrão para os seguintes comandos de menu padrão do Windows:
ID_WINDOW_TILE_VERT
ID_WINDOW_TILE_HORZ
ID_WINDOW_CASCADE
ID_WINDOW_ARRANGE
Uma janela com moldura da interface MDI também tem uma implementação de ID_WINDOW_NEW, que cria um novo quadro e a exibição no documento atual. Um aplicativo pode substituir essas implementações de comando padrão para personalizar o tratamento de janela da interface MDI.
Não use o operador delete
do C++ para destruir uma janela com moldura. Use o CWnd::DestroyWindow
em vez disso. A implementação CFrameWnd
de PostNcDestroy
excluirá o objeto C++ quando a janela for destruída. Quando o usuário fechar a janela com moldura, o manipulador OnClose
padrão chamará DestroyWindow
.
Para obter mais informações sobre CMDIFrameWnd
, confira Janelas com Moldura.
Hierarquia de herança
CMDIFrameWnd
Requisitos
Cabeçalho: afxwin.h
CMDIFrameWnd::CMDIFrameWnd
Constrói um objeto CMDIFrameWnd
.
CMDIFrameWnd();
Comentários
Chame a função de membro Create
ou LoadFrame
para criar a janela com moldura visível da interface MDI.
Exemplo
// 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
Cria a janela cliente da interface MDI que gerencia os objetos CMDIChildWnd
.
virtual BOOL CreateClient(
LPCREATESTRUCT lpCreateStruct,
CMenu* pWindowMenu);
Parâmetros
lpCreateStruct
Um ponteiro longo para uma estrutura CREATESTRUCT.
pWindowMenu
Um ponteiro para o menu pop-up do Windows.
Valor de retorno
Diferente de zero se tiver êxito; caso contrário, 0.
Comentários
Essa função de membro deve ser chamada, se você substituir a função de membro OnCreate
diretamente.
Exemplo
// 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
Cria uma nova janela filho.
CMDIChildWnd* CreateNewChild(
CRuntimeClass* pClass,
UINT nResource,
HMENU hMenu = NULL,
HACCEL hAccel = NULL);
Parâmetros
pClass
A classe em tempo de execução da janela filho a ser criada.
nResource
A ID dos recursos compartilhados associados à janela filho.
hMenu
O menu da janela filho.
hAccel
O acelerador da janela filho.
Comentários
Use essa função para criar as janelas filho de uma janela com moldura da interface MDI.
Exemplo
// 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
Chame essa função de membro para obter um identificador para o menu pop-up atual chamado "Janela" (o menu pop-up com itens de menu para gerenciamento de janelas da interface MDI).
virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);
Parâmetros
hMenuBar
A barra de menus atual.
Valor de retorno
O menu pop-up do Windows, se houver. Caso contrário, NULL.
Comentários
A implementação padrão procura um menu pop-up que contém os comandos de menu padrão do Windows, como ID_WINDOW_NEW e ID_WINDOW_TILE_HORZ.
Substitua essa função de membro, se você tiver um menu Janela que não use as IDs de comando do menu padrão.
Exemplo
// 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
Ativa uma janela filho diferente da MDI.
void MDIActivate(CWnd* pWndActivate);
Parâmetros
pWndActivate
Aponta para a janela filho da interface MDI a ser ativada.
Comentários
Essa função de membro envia a mensagem WM_MDIACTIVATE para a janela filho que está sendo ativada e a janela filho que está sendo desativada.
Essa é a mesma mensagem enviada, se o usuário alterar o foco para uma janela filho da interface MDI usando o mouse ou teclado.
Observação
Uma janela filho da interface MDI é ativada independentemente da janela com moldura da MDI. Quando o quadro se torna ativo, a janela filho ativada pela última vez com uma chamada recebe uma mensagem , para desenhar uma janela com moldura ativa e a barra de legenda, mas não recebe outra mensagem WM_MDIACTIVATE.
Exemplo
Consulte o exemplo para CMDIFrameWnd::GetWindowMenuPopup.
CMDIFrameWnd::MDICascade
Organiza todas as janelas filho da interface MDI em cascata.
void MDICascade();
void MDICascade(int nType);
Parâmetros
nType
Especifica um sinalizador em cascata. Somente o seguinte sinalizador pode ser especificado: MDITILE_SKIPDISABLED, o que impede que as janelas filho da interface MDI desabilitadas sejam organizadas em cascata.
Comentários
A primeira versão de MDICascade
, sem parâmetros, organiza em cascata todas as janelas filho da interface MDI, incluindo as desabilitadas. Opcionalmente, a segunda versão não organiza em cascata as janelas filho da interface MDI, se você especificar MDITILE_SKIPDISABLED para o parâmetro nType.
Exemplo
// 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
Recupera a janela filho da interface MDI ativa no momento, juntamente com um sinalizador que indica se a janela filho está maximizada.
CMDIChildWnd* MDIGetActive(BOOL* pbMaximized = NULL) const;
Parâmetros
pbMaximized
Um ponteiro para um valor retornado BOOL. Defina como TRUE no retorno, se a janela estiver maximizada. Caso contrário, FALSE.
Valor de retorno
Um ponteiro para a janela filho MDI ativa.
Exemplo
Confira o exemplo para CMDIChildWnd::MDIMaximize.
CMDIFrameWnd::MDIIconArrange
Organiza todas as janelas filho minimizadas do documento.
void MDIIconArrange();
Comentários
Isso não afeta janelas filho que não estão minimizadas.
Exemplo
Confira o exemplo para CMDIFrameWnd::MDICascade.
CMDIFrameWnd::MDIMaximize
Maximiza a janela filho da interface MDI especificada.
void MDIMaximize(CWnd* pWnd);
Parâmetros
pWnd
Aponta para a janela a ser maximizada.
Comentários
Quando uma janela filho é maximizada, o Windows a redimensiona para fazer com que a área de cliente preencha a janela cliente. O Windows coloca o menu Controle da janela filho na barra de menus do quadro, para que o usuário possa restaurar ou fechar a janela filho. Ele também adiciona o título da janela filho ao título da janela com moldura.
Se outra janela filho da interface MDI estiver ativada quando a janela filho da MDI ativa no momento estiver maximizada, o Windows restaurará o filho ativo no momento e maximizará a janela filho recém-ativada.
Exemplo
Confira o exemplo para CMDIChildWnd::MDIMaximize.
CMDIFrameWnd::MDINext
Ativa a janela filho imediatamente atrás da janela filho ativa no momento e coloca a janela filho ativa no momento atrás de todas as outras janelas filho.
void MDINext();
Comentários
Se a janela filho da interface MDI ativa no momento estiver maximizada, a função de membro restaurará o filho ativo no momento e maximizará o filho recém-ativado.
Exemplo
// 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
Ativa a janela filho anterior e coloca a janela filho ativa no momento imediatamente atrás dela.
void MDIPrev();
Comentários
Se a janela filho da interface MDI ativa no momento estiver maximizada, a função de membro restaurará o filho ativo no momento e maximizará o filho recém-ativado.
CMDIFrameWnd::MDIRestore
Restaura uma janela filho da MDI do tamanho maximizado ou minimizado.
void MDIRestore(CWnd* pWnd);
Parâmetros
pWnd
Aponta para a janela a ser restaurada.
Exemplo
Confira o exemplo para CMDIChildWnd::MDIRestore.
CMDIFrameWnd::MDISetMenu
Substitui o menu de uma janela com moldura da interface MDI, o menu pop-up do Windows ou ambos.
CMenu* MDISetMenu(
CMenu* pFrameMenu,
CMenu* pWindowMenu);
Parâmetros
pFrameMenu
Especifica o menu do novo menu de janela com moldura. Se NULL, o menu não será alterado.
pWindowMenu
Especifica o menu do novo menu pop-up do Windows. Se NULL, o menu não será alterado.
Valor de retorno
Um ponteiro para o menu de janela com moldura substituído por esta mensagem. O ponteiro pode ser temporário e não deve ser armazenado para uso posterior.
Comentários
Depois de chamar MDISetMenu
, um aplicativo deve chamar a função de membro DrawMenuBar de CWnd
para atualizar a barra de menus.
Se essa chamada substituir o menu pop-up do Windows, os itens de menu da janela filho da interface MDI serão removidos do menu Janela anterior e adicionados ao novo menu pop-up do Windows.
Se uma janela filho da interface MDI for maximizada e essa chamada substituir o menu de janela com moldura da MDI, o menu Controle e os controles de restauração serão removidos do menu anterior da janela com moldura e adicionados ao novo menu.
Não chame essa função de membro, se você usar a estrutura para gerenciar as janelas filho da interface MDI.
Exemplo
// 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
Organiza todas as janelas filho em um formato organizado lado a lado.
void MDITile();
void MDITile(int nType);
Parâmetros
nType
Especifica um sinalizador de bloco. Esse parâmetro pode usar qualquer um dos sinalizadores a seguir:
MDITILE_HORIZONTAL Organiza lado a lado as janelas filho da interface MDI para que uma janela seja exibida acima da outra.
MDITILE_SKIPDISABLED Impede que as janelas filho da interface MDI desabilitadas sejam organizadas lado a lado.
MDITILE_VERTICAL Organiza lado a lado as janelas filho da interface MDI para que uma janela seja exibida ao lado da outra.
Comentários
A primeira versão de MDITile
, sem parâmetros, dimensiona as janelas verticalmente no Windows versão 3.1 e posteriores. A segundo versão organiza lado a lado as janelas vertical ou horizontalmente, dependendo do valor do parâmetro nType.
Exemplo
Confira o exemplo para CMDIFrameWnd::MDICascade.
Confira também
MDI de exemplo do MFC
MFC Sample MDIDOCVW
MFC Sample SNAPVW
Classe CFrameWnd
Gráfico da hierarquia
Classe CWnd
Classe CMDIChildWnd