Compartir por


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

  1. En el menú principal, seleccione Archivo>Nuevo>Proyecto para abrir el cuadro de diálogo Crear nuevo proyecto.

  2. En la parte superior del cuadro de búsqueda, escriba MFC Y después seleccione Aplicación MFC en la lista de resultados.

  3. 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.

  4. Elija el botón Crear para crear el proyecto.

    Una vez que se muestre el Asistente para aplicaciones MFC, use las siguientes opciones:

    1. 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).

    2. En el panel Compatibilidad con documentos compuestos, seleccione Ninguno.

    3. No realice ninguna modificación en el panel de propiedades de plantilla de documentos.

    4. 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.

    5. 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.

    6. 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

  1. 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.

  2. 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:

    1. 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).

    2. En el panel Compatibilidad con documentos compuestos, seleccione Ninguno.

    3. No haga ninguna modificación en el panel Cadenas de plantillas de documentos.

    4. 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.

    5. 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.

    6. 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.

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

  1. 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 para CMFCShellListCtrl:

    #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;
    
  2. El Asistente para aplicaciones MFC ya ha creado un objeto CMFCShellTreeCtrl en la clase CMainFrame, 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;
    }
    
  3. Ahora vamos a actualizar la clase CMFCShellControlsView para controlar el mensaje de Windows WM_CREATE. Abra la ventana Vista de clases y seleccione la clase CMFCShellControlsView. 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 a WM_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 objeto CMFCShellListCtrl. Busque la definición del método de OnCreate 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;
    }
    
  4. 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étodo OnSize 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);
    }
    
  5. El último paso consiste en conectar los objetos CMFCShellTreeCtrl y CMFCShellListCtrl mediante el método CMFCShellTreeCtrl::SetRelatedList. Después de llamar a CMFCShellTreeCtrl::SetRelatedList, CMFCShellListCtrl mostrará automáticamente el contenido del elemento seleccionado en CMFCShellTreeCtrl. Conectamos los objetos en el método OnActivateView, 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"
    
  6. 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 en CMFCShellTreeCtrl, CMFCShellListCtrl se actualizará automáticamente. Igualmente, si hace doble clic en una carpeta en CMFCShellListCtrl, 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++.

Consulte también

Tutoriales