Compartir a través de


CMDIChildWnd (clase)

Proporciona la funcionalidad de una ventana secundaria de la interfaz de múltiples documentos (MDI) de Windows, junto con los miembros para administrar la ventana.

Sintaxis

class CMDIChildWnd : public CFrameWnd

Miembros

Constructores públicos

Nombre Descripción
CMDIChildWnd::CMDIChildWnd Construye un objeto CMDIChildWnd.

Métodos públicos

Nombre Descripción
CMDIChildWnd::Create Crea la ventana secundaria MDI de Windows asociada con el objeto CMDIChildWnd.
CMDIChildWnd::GetMDIFrame Devuelve el marco MDI primario de la ventana del cliente MDI.
CMDIChildWnd::MDIActivate Activa esta ventana secundaria MDI.
CMDIChildWnd::MDIDestroy Destruye esta ventana secundaria MDI.
CMDIChildWnd::MDIMaximize Maximiza esta ventana secundaria MDI.
CMDIChildWnd::MDIRestore Restaura esta ventana secundaria de MDI a partir de un tamaño maximizado o minimizado.
CMDIChildWnd::SetHandles Establece los identificadores de los recursos de menú y acelerador.

Comentarios

Una ventana secundaria MDI se parece mucho a una ventana de marco típica, salvo que la ventana secundaria MDI aparece dentro de una ventana de marco MDI en lugar de en el escritorio. Una ventana secundaria MDI no tiene una barra de menús propia, sino que comparte el menú de la ventana de marco MDI. El marco cambia automáticamente el menú marco MDI para representar la ventana secundaria MDI actualmente activa.

Para crear una ventana secundaria MDI útil para la aplicación, derive una clase de CMDIChildWnd. Agregue variables miembro a la clase derivada para almacenar datos específicos de la aplicación. Implemente funciones miembro de controlador de mensajes y un mapa de mensajes en la clase derivada para especificar qué ocurre cuando los mensajes se dirigen a la ventana.

Hay tres maneras de construir una ventana secundaria MDI:

  • Directamente mediante Create.

  • Directamente mediante LoadFrame.

  • La construye indirectamente a través de una plantilla de documento.

Antes de llamar a Create o LoadFrame, debe construir el objeto frame-window en el montón mediante el operador de C++ new. Antes de llamar a Create, también puede registrar una clase de ventana con la función global AfxRegisterWndClass para establecer el icono y los estilos de clase para el marco.

Use la función miembro Create para pasar los parámetros de creación del marco como argumentos inmediatos.

LoadFrame requiere menos argumentos que Create y, en su lugar, recupera la mayoría de sus valores predeterminados de los recursos, incluido el título, el icono, la tabla de aceleradores y el menú del marco. Para que sea accesible por LoadFrame, todos estos recursos deben tener el mismo identificador de recurso (por ejemplo, IDR_MAINFRAME).

Cuando un objeto CMDIChildWnd contiene vistas y documentos, el marco crea indirectamente en lugar de directamente por el programador. El objeto CDocTemplate organiza la creación del marco y las vistas contenedoras, además de la conexión de las vistas al documento adecuado. Los parámetros del constructor CDocTemplate especifican el CRuntimeClass de las tres clases implicadas (documento, marco y vista). El marco usa un objeto CRuntimeClass para crear dinámicamente nuevos marcos cuando lo especifique el usuario (por ejemplo, mediante el comando File New o el comando MDI Window New).

Se debe declarar una clase de ventana de marco derivada de CMDIChildWnd con DECLARE_DYNCREATE para que el mecanismo de RUNTIME_CLASS anterior funcione correctamente.

La clase CMDIChildWnd hereda gran parte de su implementación predeterminada de CFrameWnd. Para obtener una lista detallada de estas características, consulte la descripción de la clase CFrameWnd . La clase CMDIChildWnd tiene las siguientes características adicionales:

  • Junto con la clase CMultiDocTemplate, varios objetos CMDIChildWnd de la misma plantilla de documento comparten el mismo menú, guardando los recursos del sistema de Windows.

  • El menú de la ventana secundaria MDI actualmente activa reemplaza por completo el menú de la ventana del marco MDI y el título de la ventana secundaria MDI actualmente activa se agrega al título de la ventana del marco MDI. Para obtener más ejemplos de funciones de ventana secundaria de MDI que se implementan junto con una ventana de marco MDI, vea la descripción de la clase CMDIFrameWnd.

No use el operador de C++ delete para destruir una ventana de marco. Use CWnd::DestroyWindow en su lugar. La implementación CFrameWnd de PostNcDestroy eliminará el objeto de C++ cuando se destruya la ventana. Cuando el usuario cierra la ventana de marco, el controlador predeterminado OnClose llamará a DestroyWindow.

Para obtener más información sobre CMDIChildWnd, vea Ventanas de marco.

Jerarquía de herencia

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIChildWnd

Requisitos

Encabezado: afxwin.h

CMDIChildWnd::CMDIChildWnd

Llame para construir un objeto CMDIChildWnd.

CMDIChildWnd();

Comentarios

Llame a Create para crear la ventana visible.

Ejemplo

Vea el ejemplo de CMDIChildWnd::Create.

CMDIChildWnd::Create

Llame a esta función miembro para crear una ventana secundaria de Windows MDI y adjuntarla al 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
El valor de este parámetro se usa para apuntar a una cadena de caracteres que finaliza en null y que, a su vez, se usa para asignar el nombre de la clase Windows (una estructura WNDCLASS). El nombre de clase puede ser cualquier nombre registrado con la función global AfxRegisterWndClass. Debe ser NULL para un CMDIChildWnd estándar.

lpszWindowName
El valor de este parámetro se usa para apuntar a una cadena de caracteres que finaliza en null y que, a su vez, se usa para representar el nombre de la ventana. Se usa como texto para la barra de título.

dwStyle
Especifica los atributos de estilo de ventana. Se requiere el estilo WS_CHILD.

rect
Representa el tamaño y la posición de la ventana. El valor rectDefault se usa para permitir que el tamaño y la posición de la nueva CMDIChildWnd pueda determinarse desde Windows.

pParentWnd
Especifica el elemento primario de la ventana. Si es NULL, se usa la ventana primaria de la aplicación.

pContext
Especifica una estructura CCreateContext. Este parámetro puede ser NULL.

Valor devuelto

Si es correcta, su valor es distinto de cero. En caso contrario, es cero.

Comentarios

La ventana de marco secundario MDI activa actualmente puede determinar el título de la ventana del marco primario. Esta característica está deshabilitada desactivando el bit de estilo FWS_ADDTOTITLE de la ventana de marco secundario.

El marco llama a esta función miembro en respuesta a un comando de usuario para crear una ventana secundaria y el marco usa el parámetro pContext para conectar correctamente la ventana secundaria a la aplicación. Cuando se llama a Create, pContext puede ser NULL.

Ejemplo 1

Este controlador de comandos de menú de ejemplo invoca Create para crear una ventana secundaria de 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
}

Ejemplo 2

El código de ejemplo llama al método Create de CHelloWnd, una clase 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 ejemplo muestra la implementación Create de la clase 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

Llame a esta función para devolver el marco primario MDI.

CMDIFrameWnd* GetMDIFrame();

Valor devuelto

Puntero a la ventana del marco primario MDI.

Comentarios

El marco devuelto es dos elementos primarios quitados de CMDIChildWnd y es el elemento primario de la ventana de tipo MDICLIENT que administra el objeto CMDIChildWnd. Llame a la función miembro GetParent para devolver el elemento primario MDICLIENT CMDIChildWnd inmediato del objeto como puntero temporal CWnd.

Ejemplo

Vea el ejemplo de CMDIFrameWnd::MDISetMenu.

CMDIChildWnd::MDIActivate

Llame a esta función miembro para activar una ventana secundaria MDI independientemente de la ventana de marco MDI.

void MDIActivate();

Comentarios

Cuando el marco se activa, también se activará la ventana secundaria que se activó por última vez.

Ejemplo

Vea el ejemplo de CMDIFrameWnd::GetWindowMenuPopup.

CMDIChildWnd::MDIDestroy

Llame a esta función miembro para destruir una ventana secundaria MDI.

void MDIDestroy();

Comentarios

La función miembro quita el título de la ventana secundaria de la ventana de marco y desactiva la ventana secundaria.

Ejemplo

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

Llame a esta función miembro para maximizar una ventana secundaria MDI.

void MDIMaximize();

Comentarios

Cuando se maximiza una ventana secundaria, Windows lo cambia de tamaño para que su área de cliente rellene el área de cliente de la ventana de marco. Windows coloca el menú Control de la ventana secundaria en la barra de menús del marco para que el usuario pueda restaurar o cerrar la ventana secundaria y agrega el título de la ventana secundaria al título de la ventana de marco.

Ejemplo

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

Llame a esta función miembro para restaurar una ventana secundaria MDI de tamaño maximizado o minimizado.

void MDIRestore();

Ejemplo

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

Establece los identificadores de los recursos de menú y acelerador.

void SetHandles(
    HMENU hMenu,
    HACCEL hAccel);

Parámetros

hMenu
Identificador de un recurso de menú.

hAccel
Identificador de un recurso de aceleración.

Comentarios

Llame a esta función para establecer los recursos de menú y acelerador utilizados por el objeto de ventana secundaria MDI.

Consulte también

Ejemplo MDI de MFC
Ejemplo MDIDOCVW de MFC
Ejemplo SNAPVW de MFC
CFrameWnd (clase)
Gráfico de jerarquías
CWnd (clase)
CMDIFrameWnd (clase)