TN025: Creación de documentos, vistas y marcos
Nota:
La nota técnica siguiente no se ha actualizado desde que se incluyó por primera vez en la documentación en línea. Como resultado, algunos procedimientos y temas podrían estar obsoletos o ser incorrectos. Para obtener información más reciente, se recomienda buscar el tema de interés en el índice de la documentación en línea.
En esta nota se describen los problemas de creación y propiedad de WinApps, DocTemplates, Documentos, Marcos y Vistas.
WinApp
Hay un objeto CWinApp
en el sistema.
Se construye e inicializa estáticamente mediante la implementación interna del marco de WinMain
. Debe derivar de CWinApp
para hacer cualquier cosa útil (excepción: los archivos DLL de extensión MFC no deben tener una instancia de CWinApp
, la inicialización se realiza en DllMain
en su lugar).
Un objeto CWinApp
posee una lista de plantillas de documento (un CPtrList
). Hay una o varias plantillas de documento por aplicación. DocTemplates normalmente se cargan desde el archivo de recursos (es decir, una matriz de cadenas) en CWinApp::InitInstance
.
pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);
AddDocTemplate(pTemplate);
El único objeto CWinApp
posee todas las ventanas de marco de la aplicación. La ventana de marco principal de la aplicación debe almacenarse en CWinApp::m_pMainWnd
; normalmente se establece m_pMainWnd en la implementación InitInstance
si no ha dejado que AppWizard lo haga por usted. Para la interfaz de documento único (SDI), se trata de una CFrameWnd
que actúa como ventana principal del marco de la aplicación, así como la única ventana de marco de documento. Para varias interfaces de documento (MDI), se trata de un MDI-Frame (clase CMDIFrameWnd
) que actúa como la ventana de marco de aplicación principal que contiene todos los elementos secundarios CFrameWnd
. Cada ventana secundaria es de clase CMDIChildWnd
(derivada de CFrameWnd
) y actúa como una de las ventanas de marco de documento potencialmente muchas.
DocTemplates
CDocTemplate
es el creador y administrador de documentos. Posee los documentos que crea. Si la aplicación usa el enfoque basado en recursos que se describe a continuación, no será necesario derivar de CDocTemplate
.
Para una aplicación SDI, la clase CSingleDocTemplate
realiza un seguimiento de un documento abierto. Para una aplicación MDI, la clase CMultiDocTemplate
mantiene una lista (una CPtrList
) de todos los documentos abiertos actualmente creados a partir de esa plantilla. CDocTemplate::AddDocument
y CDocTemplate::RemoveDocument
proporcionan las funciones miembro virtuales para agregar o quitar un documento de la plantilla. CDocTemplate
es un amigo de CDocument
para que podamos establecer el puntero atrás protegido CDocument::m_pDocTemplate
para que apunte a la plantilla de documento que creó el documento.
CWinApp
controla la implementación OnFileOpen
predeterminada, que a su vez consultará todas las plantillas de documento. La implementación incluye buscar documentos ya abiertos y decidir en qué formato abrir nuevos documentos.
CDocTemplate
administra el enlace de la interfaz de usuario para documentos y marcos.
CDocTemplate
mantiene un recuento del número de documentos sin nombre.
CDocument
Un CDocument
es propiedad de un CDocTemplate
.
Los documentos tienen una lista de vistas abiertas actualmente (derivadas de CView
) que ven el documento (un CPtrList
).
Los documentos no crean ni destruyen las vistas, pero se adjuntan entre sí después de crearlas. Cuando se cierra un documento (es decir, a través de Archivo/Cerrar), se cerrarán todas las vistas adjuntas. Cuando se cierre la última vista de un documento (es decir, Ventana/Cerrar), se cerrará el documento.
La interfaz CDocument::AddView
, RemoveView
se usa para mantener la lista de vistas. CDocument
es un amigo de CView
para que podamos establecer el puntero trasero CView::m_pDocument
.
CFrameWnd
Un CFrameWnd
(también conocido como marco) desempeña el mismo papel que en MFC 1.0, pero ahora la clase CFrameWnd
está diseñada para usarse en muchos casos sin derivar una nueva clase. Las clases derivadas CMDIFrameWnd
y CMDIChildWnd
también se mejoran, por lo que ya se han implementado muchos comandos estándar.
CFrameWnd
es responsable de crear ventanas en el área cliente del marco. Normalmente hay una ventana principal que rellena el área de cliente del marco.
Para una ventana de MDI-Frame, el área de cliente se rellena con el control MDICLIENT, que a su vez es el elemento primario de todas las ventanas de marco de MDI-Child. Para una ventana de SDI-Frame o una ventana de marco de MDI-Child, el área de cliente normalmente se rellena con un objeto de ventana derivado de CView
. En el caso de CSplitterWnd
, el área cliente de la vista se rellena con el objeto de ventana CSplitterWnd
y los objetos de ventana derivados CView
(uno por panel dividido) se crean como ventanas secundarias de CSplitterWnd
.