Partilhar via


Classe CMDIChildWnd

Fornece a funcionalidade de uma janela filho MDI (interface de documento múltiplo) do Windows, além dos membros para gerenciar a janela.

Sintaxe

class CMDIChildWnd : public CFrameWnd

Membros

Construtores públicos

Nome Descrição
CMDIChildWnd::CMDIChildWnd Constrói um objeto CMDIChildWnd.

Métodos públicos

Nome Descrição
CMDIChildWnd::Create Cria a janela filho MDI do Windows associada ao objeto CMDIChildWnd.
CMDIChildWnd::GetMDIFrame Retorna o quadro MDI pai da janela do cliente MDI.
CMDIChildWnd::MDIActivate Ativa essa nova janela filho MDI.
CMDIChildWnd::MDIDestroy Destrói essa janela filho MDI.
CMDIChildWnd::MDIMaximize Maximiza essa nova janela filho MDI.
CMDIChildWnd::MDIRestore Restaura essa janela filho MDI do tamanho maximizado ou minimizado.
CMDIChildWnd::SetHandles Define os identificadores dos recursos de menu e de acelerador.

Comentários

Uma janela filho MDI se parece muito com uma janela do quadro típica, exceto que a janela filho MDI aparece dentro de uma janela do quadro MDI em vez de na área de trabalho. Uma janela filho MDI não possui uma barra de menus própria, mas compartilha o menu da janela do quadro MDI. A estrutura altera automaticamente o menu do quadro MDI para representar a janela filho MDI atualmente ativa.

Para criar uma janela filho MDI útil para o aplicativo, derive uma classe de CMDIChildWnd. 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.

Há três maneiras de construir uma janela filho MDI:

  • Construí-la diretamente usando Create.

  • Construí-la diretamente usando LoadFrame.

  • Construir indiretamente por meio de um modelo de documento.

Antes de chamar Create ou LoadFrame, será necessário construir o objeto de janela do quadro no heap usando o novo operador C++ new. 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 acessíveis pelo LoadFrame, todos esses recursos deverão ter a mesma ID do recurso (por exemplo, IDR_MAINFRAME).

Quando um objeto CMDIChildWnd contém exibições e documentos, eles são criados indiretamente pela estrutura em vez de diretamente pelo programador. O objeto CDocTemplate orquestra a criação do quadro, a criação dos modos de exibição que contêm e a conexão dos modos de exibição com o documento apropriado. Os parâmetros do construtor CDocTemplate especificam o CRuntimeClass das três classes envolvidas (documento, quadro e exibição). Um objeto CRuntimeClass é usado pela estrutura para criar dinamicamente novos quadros quando especificado pelo usuário (por exemplo, usando o comando Arquivo Novo ou o comando Nova Janela MDI).

Uma classe de janela do quadro derivada de CMDIChildWnd deverá ser declarada com DECLARE_DYNCREATE para que o mecanismo RUNTIME_CLASS acima funcione corretamente.

A classe CMDIChildWnd 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 CMDIChildWnd tem os seguintes recursos adicionais:

  • Em conjunto com a classe CMultiDocTemplate, vários objetos CMDIChildWnd do mesmo modelo de documento compartilham o mesmo menu, economizando recursos do sistema Windows.

  • O menu da janela filho MDI ativa no momento substitui inteiramente o menu da janela do quadro MDI e a legenda da janela filho MDI ativa no momento é adicionada à legenda da janela do quadro MDI. Para obter mais exemplos de funções de janela filho MDI implementadas em conjunto com uma janela do quadro MDI, consulte a descrição da classe CMDIFrameWnd.

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 CMDIChildWnd, confira Janelas com Moldura.

Hierarquia de herança

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIChildWnd

Requisitos

Cabeçalho: afxwin.h

CMDIChildWnd::CMDIChildWnd

Chame para construir um objeto CMDIChildWnd.

CMDIChildWnd();

Comentários

Chame Create para criar a janela visível.

Exemplo

Consulte o exemplo para CMDIChildWnd::Create.

CMDIChildWnd::Create

Chame essa função membro para criar uma janela filho MDI do Windows e anexá-la ao objeto CMDIChildWnd.

virtual BOOL Create(
    LPCTSTR lpszClassName,
    LPCTSTR lpszWindowName,
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
    const RECT& rect = rectDefault,
    CMDIFrameWnd* pParentWnd = NULL,
    CCreateContext* pContext = NULL);

Parâmetros

lpszClassName
Aponta para uma cadeia de caracteres terminada em nulo que nomeia a classe do Windows (uma estrutura WNDCLASS). O nome da classe pode ser qualquer nome registrado com a função global AfxRegisterWndClass. Deverá ser NULL para um padrão CMDIChildWnd.

lpszWindowName
Aponta para uma cadeia de caracteres terminada em nulo que representa o nome da janela. Usado como texto para a barra de título.

dwStyle
Especifica os atributos de estilo de janela. O estilo WS_CHILD é obrigatório.

rect
Contém o tamanho e a posição da janela. O valor rectDefault permite que o Windows especifique o tamanho e a posição do novo CMDIChildWnd.

pParentWnd
Especifica o pai da janela. Se for NULL, será usada a janela principal do aplicativo.

pContext
Especifica uma estrutura CCreateContext. Este parâmetro pode ser NULO.

Valor de retorno

Diferente de zero se tiver êxito; caso contrário, 0.

Comentários

A janela do quadro filho MDI atualmente ativa pode determinar a legenda da janela do quadro pai. É possível desabilitar esse recurso desativando o bit de estilo FWS_ADDTOTITLE da janela do quadro filho.

A estrutura chama essa função membro em resposta a um comando do usuário para criar uma janela filho e a estrutura usa o parâmetro pContext para conectar corretamente a janela filho ao aplicativo. Ao chamar Create, pContext poderá se NULO.

Exemplo 1

Este exemplo de manipulador de comando de menu invocará Create para criar uma janela filho MDI:

// CMainFrame::OnFileNewCMdiChildWnd() is a menu command handler for the
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a standard Windows MDI child window using
// the registered CMDIChildWnd class.
void CMainFrame::OnFileNewMdiChildWnd()
{
   CMDIChildWnd *pMDIChildWnd = new CMDIChildWnd;
   VERIFY(pMDIChildWnd->Create(
       NULL,                                        // standard CMDIChildWnd class
       _T("My MDIChildWnd"),                        // caption of MDI child window
       WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, // window styles
       rectDefault,                                 // default rectangle size
       this));                                      // parent window; can be NULL

   // the default PostNcDestroy handler will delete this object when destroyed
}

Exemplo 2

O código de exemplo chama o método Create de CHelloWnd, uma classe derivada de CMDIChildWnd:

// CMainFrame::OnHello() is a menu command handler for the CMainFrame
// class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a Windows MDI child window using a custom
// window class. The custom window class is registered in
// CHelloWnd::Create(). CHelloWnd is a CMDIChildWnd-derived class.
void CMainFrame::OnHello()
{
   CHelloWnd *pHelloWnd = new CHelloWnd;
   if (!pHelloWnd->Create(_T("Hello"),
                          WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                          rectDefault, this))
      return;

   // the default PostNcDestroy handler will delete this object when destroyed
}

Este exemplo mostra a implementação Create da classe CHelloWnd:

BOOL CHelloWnd::Create(
    LPCTSTR szTitle,
    LONG style /* = 0 */,
    const RECT &rect /* = rectDefault */,
    CMDIFrameWnd *parent /* = NULL */)
{
   // Setup the shared menu
   SetHandles(::LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_HELLO)),
              NULL);

   // Register a custom WndClass and create a window.
   // This must be done because CHelloWnd has a custom icon.
   LPCTSTR lpszHelloClass =
       AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
                           LoadCursor(NULL, IDC_ARROW),
                           (HBRUSH)(COLOR_WINDOW + 1),
                           LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_HELLO)));

   return CMDIChildWnd::Create(lpszHelloClass, szTitle, style, rect, parent);
}

CMDIChildWnd::GetMDIFrame

Chame essa função para retornar o quadro pai MDI.

CMDIFrameWnd* GetMDIFrame();

Valor de retorno

Um ponteiro para a janela do quadro pai MDI.

Comentários

O quadro retornado é, dois pais removidos do CMDIChildWnd e é o pai da janela do tipo MDICLIENT que gerencia o objeto CMDIChildWnd. Chame a função membro GetParent para retornar o pai MDICLIENT imediato do objeto CMDIChildWnd como um ponteiro CWnd temporário.

Exemplo

Consulte o exemplo para CMDIFrameWnd::MDISetMenu.

CMDIChildWnd::MDIActivate

Chame essa função membro para ativar uma janela filho MDI independentemente da janela do quadro MDI.

void MDIActivate();

Comentários

Quando o quadro se tornar ativo, a janela filha que foi ativada por último também será ativada.

Exemplo

Consulte o exemplo para CMDIFrameWnd::GetWindowMenuPopup.

CMDIChildWnd::MDIDestroy

Chame essa função membro para destruir uma janela filho MDI.

void MDIDestroy();

Comentários

A função membro remove o título da janela filho da janela do quadro e desativa a janela filho.

Exemplo

// CMainFrame::OnCloseWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It closes and destroys the current active MDI child window.
void CMainFrame::OnCloseWindow()
{
   CMDIChildWnd *child = MDIGetActive();
   if (child)
      child->MDIDestroy();
}

CMDIChildWnd::MDIMaximize

Chame essa função membro para maximizar uma janela filho MDI.

void MDIMaximize();

Comentários

Quando uma janela filho é maximizada, o Windows a redimensiona para fazer com que a área de cliente preencha a área de cliente da janela do quadro. 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 e adicionar o título da janela filho ao título da janela do quadro.

Exemplo

// CMainFrame::OnMaximizeWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It maximizes the current active MDI child window.
void CMainFrame::OnMaximizeWindow()
{
   BOOL maximized;
   CMDIChildWnd *child = MDIGetActive(&maximized);
   if (child && (!maximized))
      child->MDIMaximize(); // or MDIMaximize(child);
}

CMDIChildWnd::MDIRestore

Chame essa função membro para restaurar uma janela filho MDI de tamanho maximizado ou minimizado.

void MDIRestore();

Exemplo

// CMainFrame::OnRestoreWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It restores the current active MDI child window from maximized
// or minimized size.
void CMainFrame::OnRestoreWindow()
{
   BOOL maximized;
   CMDIChildWnd *child = MDIGetActive(&maximized);
   if (child && (maximized || child->IsIconic()))
      child->MDIRestore(); // or MDIRestore(child);
}

CMDIChildWnd::SetHandles

Define os identificadores dos recursos de menu e de acelerador.

void SetHandles(
    HMENU hMenu,
    HACCEL hAccel);

Parâmetros

hMenu
O identificador de um recurso de menu.

hAccel
O identificador de um recurso de acelerador.

Comentários

Chame essa função para definir os recursos de menu e acelerador usados pelo objeto de janela filho MDI.

Confira também

MDI de exemplo do MFC
MFC Sample MDIDOCVW
MFC Sample SNAPVW
Classe CFrameWnd
Gráfico da hierarquia
Classe CWnd
Classe CMDIFrameWnd