Tutorial: Usar los nuevos controles de Shell de MFC
En este tutorial creará una aplicación similar al Explorador de archivos. Creará una ventana que contendrá dos paneles. El panel de la izquierda contendrá un objeto CMFCShellTreeCtrl que muestra el Escritorio en una vista jerárquica. El panel de la derecha contendrá un objeto CMFCShellListCtrl que muestra los archivos de la carpeta seleccionada en el panel de la izquierda.
Requisitos previos
En Visual Studio 2017 y versiones posteriores, la compatibilidad con MFC es un componente opcional. Para instalarlo, abra el Instalador de Visual Studio desde el menú Inicio de Windows. Busque la versión de Visual Studio que está usando y elija el botón Modificar. Asegúrese de que el elemento Desarrollo de escritorio con C++ está activado. En Componentes opcionales, active el botón Compatibilidad con MFC.
En este tutorial se supone que ha configurado Visual Studio para utilizar la Configuración general de desarrollo. Si usa otra configuración de desarrollo, algunas ventanas de Visual Studio que utilizamos en este tutorial podrían no mostrarse de forma predeterminada.
Para crear una nueva aplicación MFC mediante el Asistente para aplicaciones MFC
Estos pasos varían según la versión de Visual Studio que use. Para ver la documentación de su versión preferida de Visual Studio, use el control de selector Versión. Se encuentra en la parte superior de la tabla de contenido de esta página.
Para crear un proyecto MFC en Visual Studio
En el menú principal, seleccione Archivo>Nuevo>Proyecto para abrir el cuadro de diálogo Crear nuevo proyecto.
En la parte superior del cuadro de búsqueda, escriba MFC Y después seleccione Aplicación MFC en la lista de resultados.
Haga clic en Next. En la siguiente página, escriba un nombre para el proyecto y, si lo desea, especifique la ubicación del proyecto.
Elija el botón Crear para crear el proyecto.
Una vez que se muestre el Asistente para aplicaciones MFC, use las siguientes opciones:
Elija Tipo de aplicación a la izquierda. A continuación, seleccione Single document (Documento único) y Compatibilidad de arquitectura de documento/vista. En Estilo del proyecto, seleccione Visual Studio y, en la lista desplegable Estilo visual y colores, seleccione Office 2007 (tema Azul).
En el panel Compatibilidad con documentos compuestos, seleccione Ninguno.
No realice ninguna modificación en el panel de propiedades de plantilla de documentos.
En el panel Características de la interfaz de usuario, compruebe que la opción Usar una barra de menús y una barra de herramientas está activada. Deje el resto de las opciones tal como están.
En el panel Características avanzadas, seleccione Controles ActiveX, Manifiesto de controles comunes y Panel de navegación. Deje todo lo demás como esté. La opción Panel de navegación hará que el asistente cree el panel a la izquierda de la ventana con un control
CMFCShellTreeCtrl
ya insertado.No vamos a hacer ningún cambio en el panel Clases generadas, así que haga clic en Finalizar para crear el nuevo proyecto MFC.
Para crear un proyecto MFC en Visual Studio 2017 o en versiones anteriores
Utilice el Asistente para aplicaciones MFC para crear una nueva aplicación MFC. Para ejecutar el asistente, en el menú de Archivo seleccione Nuevo y, a continuación, seleccione Proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto.
En el cuadro de diálogo Nuevo proyecto, expanda el nodo Visual C++ en el panel Tipos de proyecto y seleccione MFC. A continuación, en el panel Plantillas, seleccione Aplicación MFC. Escriba un nombre para el proyecto, por ejemplo,
MFCShellControls
, y haga clic en Aceptar.Una vez que se muestre el Asistente para aplicaciones MFC, use las siguientes opciones:
En el panel Tipo de aplicación, en Tipo de aplicación, desactive la opción Organización por fichas. A continuación, seleccione Single document (Documento único) y Compatibilidad con la arquitectura documento/vista. En Estilo del proyecto, seleccione Visual Studio y, en la lista desplegable Estilo visual y colores, seleccione Office 2007 (tema Azul).
En el panel Compatibilidad con documentos compuestos, seleccione Ninguno.
No haga ninguna modificación en el panel Cadenas de plantillas de documentos.
En el panel Compatibilidad con bases de datos (Visual Studio 2015 y versiones anteriores), seleccione Ninguno, ya que la aplicación no usa una base de datos.
En el panel Características de la interfaz de usuario, compruebe que la opción Usar una barra de menús y una barra de herramientas está activada. Deje el resto de las opciones tal como están.
En el panel Características avanzadas, en Características avanzadas, seleccione solo Controles ActiveX y Manifiesto de controles comunes. En Paneles de marco avanzados, seleccione solo la opción Panel de navegación. Esto hará que el asistente cree el panel a la izquierda de la ventana con un control
CMFCShellTreeCtrl
ya insertado.No vamos a hacer ningún cambio en el panel Clases generadas, así que haga clic en Finalizar para crear el nuevo proyecto MFC.
Compruebe que la aplicación se creó correctamente; para ello, compílela y ejecútela. Para compilar la aplicación, en el menú Compilar, seleccione Compilar solución. Si la aplicación se compila correctamente, en el menú Depurar, seleccione Iniciar depuración para ejecutarla.
El asistente crea automáticamente una aplicación con una barra de menús estándar, una barra de herramientas estándar, una barra de estado estándar y una barra de Outlook a la izquierda de la ventana con una vista Carpetas y una vista Calendario.
Para agregar el control de lista de shell a la vista del documento
En esta sección, agregará una instancia de
CMFCShellListCtrl
a la vista que el asistente creó. Haga doble clic en MFCShellControlsView.h en el Explorador de soluciones para abrir el archivo de encabezado de la vista.Busque la directiva
#pragma once
cerca de la parte superior del archivo de encabezado. Inmediatamente debajo de la directiva, agregue este código para incluir el archivo de encabezado paraCMFCShellListCtrl
:#include <afxShellListCtrl.h>
Agregue una variable miembro de tipo
CMFCShellListCtrl
. Primero, busque el siguiente comentario en el archivo de encabezado:// Generated message map functions
Inmediatamente antes del comentario, agregue este código:
private: CMFCShellListCtrl m_wndList;
El Asistente para aplicaciones MFC ya ha creado un objeto
CMFCShellTreeCtrl
en la claseCMainFrame
, pero es miembro protegido. Accederemos al objeto más adelante, por lo que ahora crearemos un descriptor de acceso para el mismo. Haga doble clic en el Explorador de soluciones para abrir el archivo de encabezado MainFrm.h. Localice el comentario siguiente:// Attributes
Inmediatamente debajo de él, agregue la declaración de método siguiente:
public: CMFCShellTreeCtrl& GetShellTreeCtrl();
A continuación, haga doble clic en el Explorador de soluciones para abrir el archivo de código fuente MainFrm.cpp. En la parte inferior de ese archivo, agregue la definición de método siguiente:
CMFCShellTreeCtrl& CMainFrame::GetShellTreeCtrl() { return m_wndTree; }
Ahora vamos a actualizar la clase
CMFCShellControlsView
para controlar el mensaje de WindowsWM_CREATE
. Abra la ventana Vista de clases y seleccione la claseCMFCShellControlsView
. Haga clic con el botón secundario y seleccione Propiedades.A continuación, en el Asistente para clases, haga clic en la pestaña Mensajes. Desplácese hacia abajo hasta que encuentre el mensaje
WM_CREATE
. En la lista desplegable situada junto aWM_CREATE
, seleccione <Add> OnCreate. El comando crea un controlador de mensajes y se actualiza automáticamente el mapa de mensajes de MFC.En el método
OnCreate
, vamos a crear ahora nuestro propio objetoCMFCShellListCtrl
. Busque la definición del método deOnCreate
en el archivo de código fuente MFCShellControlsView.cpp y reemplace la implementación por el código siguiente:int CMFCShellControlsView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; CRect rectDummy (0, 0, 0, 0); m_wndList.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, rectDummy, this, 1); return 0; }
Repita el paso anterior, esta vez para el mensaje
WM_SIZE
. Esto hará que la vista de las aplicaciones se rediseñe siempre que un usuario cambie el tamaño de la ventana de la aplicación. Reemplace la definición del métodoOnSize
por el código siguiente:void CMFCShellControlsView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); m_wndList.SetWindowPos(NULL, -1, -1, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
El último paso consiste en conectar los objetos
CMFCShellTreeCtrl
yCMFCShellListCtrl
mediante el método CMFCShellTreeCtrl::SetRelatedList. Después de llamar aCMFCShellTreeCtrl::SetRelatedList
,CMFCShellListCtrl
mostrará automáticamente el contenido del elemento seleccionado enCMFCShellTreeCtrl
. Conectamos los objetos en el métodoOnActivateView
, que se invalida desde CView::OnActivateView.En el archivo de encabezado MFCShellControlsView.h, dentro de la declaración de clase de
CMFCShellControlsView
, agregue la declaración de método siguiente:protected: virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
A continuación, agregue la definición del método al archivo de código fuente MFCShellControlsView.cpp:
void CMFCShellControlsView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { if (bActivate&& AfxGetMainWnd() != NULL) { ((CMainFrame*)AfxGetMainWnd())->GetShellTreeCtrl().SetRelatedList(&m_wndList); } CView::OnActivateView(bActivate, pActivateView, pDeactiveView); }
Dado que llamamos a los métodos desde la clase
CMainFrame
, debemos agregar una directiva#include
en la parte superior del archivo de código fuente MFCShellControlsView.cpp:#include "MainFrm.h"
Compruebe que la aplicación se creó correctamente; para ello, compílela y ejecútela. Para compilar la aplicación, en el menú Compilar, seleccione Compilar solución. Si la aplicación se compila correctamente, en el menú Depurar, seleccione Iniciar depuración para ejecutarla.
Ahora deberían mostrarse los detalles del elemento seleccionado en el control
CMFCShellTreeCtrl
en el panel de vista. Al hacer clic en un nodo enCMFCShellTreeCtrl
,CMFCShellListCtrl
se actualizará automáticamente. Igualmente, si hace doble clic en una carpeta enCMFCShellListCtrl
,CMFCShellTreeCtrl
debe actualizarse automáticamente.Haga clic con el botón secundario en cualquier elemento del control de árbol o del control de lista. Obtendrá el mismo menú contextual que si utilizara el Explorador de archivos auténtico.
Pasos siguientes
El asistente creó una barra de Outlook con un panel Carpetas y un panel Calendario. Probablemente no tenga sentido tener un panel Calendario en una ventana del Explorador, por lo que debe quitar ese panel ahora.
CMFCShellListCtrl
admite la presentación de archivos de distintos modos, como Iconos grandes, Iconos pequeños, Lista y Detalles. Actualice la aplicación para implementar esta funcionalidad. Sugerencia: vea Ejemplos de Visual C++.