Implementación de una vista de carpetas
Windows Shell proporciona una implementación predeterminada de la vista de carpetas, conocida coloquialmente como DefView, para que pueda evitar gran parte del trabajo de implementar su propia extensión de espacio de nombres. Dado que algunas características de vista no se pueden lograr a través de vistas personalizadas, a menudo se recomienda usar el objeto de vista de carpeta del sistema predeterminado en lugar de una vista personalizada. Para obtener más información, vea SHCreateShellFolderView. En el resto de este tema se describe la implementación de una vista de carpeta personalizada que no admite características de vista más recientes.
A diferencia de la vista de árbol, el Explorador de Windows no administra el contenido de una vista de carpeta. En su lugar, la ventana de vista de carpetas hospeda una ventana secundaria proporcionada por el objeto folder. El objeto folder es responsable de crear un objeto de vista de carpeta para mostrar el contenido de la carpeta en la ventana secundaria.
La clave para implementar un objeto de vista de carpeta es la interfaz IShellView . El Explorador de Windows usa esta interfaz para comunicarse con el objeto de vista de carpetas. Antes de mostrar una vista de carpeta, el Explorador de Windows llama al método IShellFolder::CreateViewObject del objeto de carpeta con riid establecido en IID_IShellView. Cree un objeto de vista de carpeta y devuelva su interfaz IShellView . A continuación, el objeto de vista de carpeta debe crear una ventana secundaria de la ventana de vista de carpetas y usar la ventana secundaria para mostrar información sobre el contenido de la carpeta.
Además de controlar cómo se muestran los datos, las extensiones también pueden personalizar varias de las características del Explorador de Windows. Por ejemplo, una extensión puede agregar elementos a la barra de herramientas o a la barra de menús, o mostrar información en la barra de estado.
- El objeto Vista de carpetas
- Inicialización del objeto vista de carpeta
- Mostrar la vista carpeta
- Implementación de IShellView
- Uso de IShellBrowser para comunicarse con el Explorador de Windows
El objeto Vista de carpetas
Un objeto de vista de carpeta es un objeto Component Object Model (COM) que expone una interfaz IShellView . Este objeto es responsable de:
- Crear una ventana secundaria de la ventana de vista de carpetas y usarla para mostrar el contenido de la carpeta.
- Controlar la comunicación con el Explorador de Windows.
- Agregar comandos específicos de carpeta a la barra de menús y la barra de herramientas del Explorador de Windows y controlar esos comandos cuando se seleccionan.
- Administrar la interacción del usuario con la ventana de vista de carpetas, como mostrar menús contextuales o controlar las operaciones de arrastrar y colocar.
En este documento se describen los tres primeros temas. Dado que la interacción del usuario con la vista de carpetas tiene lugar dentro de la ventana secundaria, el objeto de vista de carpeta es responsable de controlarlo como lo haría con cualquier otra ventana.
El Explorador de Windows solicita un objeto de vista de carpeta llamando a IShellFolder::CreateViewObject del objeto de carpeta con riid establecido en IID_IShellView. El procedimiento para crear una vista de carpeta es:
- El objeto folder crea una nueva instancia del objeto de vista de carpeta y devuelve un puntero a su interfaz IShellView .
- El Explorador de Windows inicializa el objeto de vista de carpetas llamando al método IShellView::CreateViewWindow . Cree una ventana secundaria de la ventana de vista de carpetas y devuelva su identificador al Explorador de Windows.
- El objeto de vista de carpetas usa la interfazIShellBrowser del Explorador de Windows para personalizar la barra de herramientas del Explorador de Windows, la barra de menús y la barra de estado.
- El objeto de vista de carpetas muestra el contenido de la carpeta en la ventana secundaria.
- El objeto de vista de carpetas controla la interacción del usuario con la vista de carpetas y cualquier elemento de barra de herramientas o barra de menús específica de la carpeta.
Inicialización del objeto vista de carpeta
El Explorador de Windows inicializa el objeto de vista de carpetas llamando al método IShellView::CreateViewWindow . Los parámetros del método proporcionan el objeto de vista de carpeta con la información que necesita para crear la ventana secundaria que se usará para mostrar el contenido de la carpeta:
- Puntero a la interfaz IShellView del objeto de vista de carpetas anterior. Este parámetro se puede establecer en NULL.
- Estructura FOLDERSETTINGS que contiene la configuración de la vista de carpeta anterior.
- Puntero a la interfazIShellBrowser del Explorador de Windows.
- Estructura RECT con las dimensiones de la ventana de vista de carpetas.
Se llama al método IShellView::CreateViewWindow antes de que se destruya el objeto de vista de carpeta anterior. El puntero de interfaz IShellView le permite comunicarse con el objeto de vista de carpeta anterior. Esta interfaz es principalmente útil si la carpeta anterior pertenece a la extensión y usa el mismo esquema de visualización. Si es así, puede comunicarse con el objeto de vista de carpeta anterior para fines como intercambiar configuraciones privadas.
Una manera sencilla de determinar si el puntero IShellView pertenece a la extensión es hacer que todos los objetos de vista de carpetas expongan una interfaz privada. Llame a IShellView::QueryInterface para solicitar la interfaz privada y examine el valor devuelto para determinar si el objeto de vista de carpeta es uno de los suyos. A continuación, puede usar un método privado en esa interfaz para intercambiar información.
La estructura FOLDERSETTINGS contiene la configuración de visualización de la vista de carpeta anterior. La configuración principal es el modo de visualización: icono grande, icono pequeño, lista o detalles. También hay una marca que contiene la configuración de una variedad de opciones de visualización, como si la vista debe estar alineada a la izquierda. La presentación de la carpeta debe seguir esta configuración en la medida de lo posible, para proporcionar a los usuarios una experiencia coherente a medida que van de una carpeta a otra. Debe almacenar esta estructura y actualizarla a medida que cambie la configuración. El Explorador de Windows llama a IShellView::GetCurrentInfo para obtener el valor más reciente de esta estructura antes de abrir la siguiente vista de carpeta.
El Explorador de Windows expone la interfaz IShellBrowser . Esta interfaz es un complemento de IShellView y permite que un objeto de vista de carpetas se comunique con el Explorador de Windows. No hay otra manera de recuperar este puntero de interfaz, por lo que el objeto de vista de carpeta debe almacenarlo para su uso posterior. En concreto, deberá llamar a IShellBrowser::GetWindow para recuperar la ventana de vista de carpeta primaria que usará para crear la ventana secundaria. Tenga en cuenta que el método IShellBrowser::GetWindow no se incluye en la documentación de IShellBrowser porque se hereda de IOleWindow. Después de almacenar el puntero de interfaz, recuerde llamar a IShellBrowser::AddRef para incrementar el número de referencias de la interfaz. Cuando ya no necesite la interfaz, llame a IShellBrowser::Release.
Para crear la ventana secundaria:
- Examine las estructuras FOLDERSETTINGS y RECT .
- Si es necesario, obtenga la configuración privada del objeto de vista de carpeta anterior.
- Llame a IShellBrowser::GetWindow para recuperar la ventana de vista de carpetas primaria.
- Cree un elemento secundario de la ventana de vista de carpetas obtenida en el paso anterior y vuelva al Explorador de Windows.
Mostrar la vista carpeta
Una vez que haya creado la ventana secundaria y la haya devuelto al Explorador de Windows, puede mostrar el contenido de la carpeta. Normalmente, las extensiones muestran su información haciendo que el host de la ventana secundaria hospede un control de vista de lista o un control WebBrowser. El control de vista de lista permite replicar la vista clásica del Explorador de Windows. El control WebBrowser permite usar un documento HTML dinámico (DHTML) para mostrar la información, al igual que la vista web del Explorador de Windows. Para obtener más información, consulte la documentación de esos controles.
La ventana de vista de carpetas siempre existe, aunque no tenga el foco. Por lo tanto, debe mantener tres estados para la ventana secundaria:
- Activado con foco. La vista de carpetas se ha creado y tiene el foco. Establezca la barra de menús o los elementos de la barra de herramientas adecuados para un estado centrado.
- Activado sin foco. La vista de carpeta se ha creado y está activa, pero no tiene el foco. Establezca la barra de menús o los elementos de la barra de herramientas adecuados para un estado no centrado. Omita los elementos que se aplican a la selección de elementos dentro de la vista de carpetas.
- Desactivado. La vista de carpeta está a punto de destruirse. Quite todos los elementos de menú específicos de la carpeta.
El Explorador de Windows notifica al objeto de vista de carpeta cuando cambia el estado de la ventana llamando a IShellView::UIActivate. A su vez, el objeto de vista de carpetas debe notificar al Explorador de Windows cuando un usuario activa la ventana de vista de carpetas llamando a IShellBrowser::OnViewWindowActive. Para obtener más información sobre esta interfaz, consulte Uso de IShellBrowser para comunicarse con el Explorador de Windows.
Mientras la vista de carpetas está activa, debe procesar los mensajes de Windows, como WM_SIZE, que pertenecen a la ventana secundaria. El procedimiento de ventana también recibirá mensajes WM_COMMAND para los elementos que haya agregado a la barra de menús o la barra de herramientas del Explorador de Windows.
Después de crear la vista de carpetas, el Explorador de Windows llama a la interfaz IShellView del objeto de vista de carpetas para pasarla una variedad de información. El objeto debe modificar su presentación en consecuencia. Cuando la vista de carpetas está a punto de destruirse, el Explorador de Windows notifica al objeto de vista de carpetas llamando a su método IShellView::D estroyViewWindow .
Implementación de IShellView
Una vez creado el objeto de carpeta, el Explorador de Windows llama a varios métodos de IShellView para solicitar información o notificar al objeto un cambio en el estado del Explorador de Windows. En esta sección se describe cómo implementar esos métodos de IShellView . Los métodos restantes se usan para fines más especializados, como el cuadro de diálogo común Abrir archivo. Para más información, consulte la documentación de IShellView .
AddPropertySheetPages
Cuando un usuario selecciona Opciones de carpeta en el menúHerramientas del Explorador de Windows, se muestra una hoja de propiedades que permite al usuario modificar las opciones de carpeta. El Explorador de Windows llama al método IShellView::AddPropertySheetPages del objeto de vista de carpetas para que pueda agregar una página a esta hoja de propiedades.
El Explorador de Windows pasa un puntero a una función de devolución de llamada AddPropSheetPageProc en el parámetro lpfn de IShellView::AddPropertySheetPages. Llame a CreatePropertySheetPage para crear la página y, a continuación, llame a AddPropSheetPageProc para agregarla a la hoja de propiedades. Para obtener más información sobre cómo controlar las hojas de propiedades, vea Hojas de propiedades.
GetCurrentInfo
Cuando el usuario cambia de una carpeta a otra, el Explorador de Windows intenta mantener una vista de carpeta similar. Por ejemplo, si la vista de carpeta anterior mostraba iconos grandes, también debería aparecer la siguiente. Cuando el Explorador de Windows llama a IShellView::CreateViewWindow para inicializar el objeto de vista de carpeta, el método recibe una estructura FOLDERSETTINGS . Esta estructura contiene información que permite que la vista de carpetas sea coherente con la vista de carpetas anterior.
Para ayudar a garantizar que la vista siguiente sea coherente con la vista actual, almacene la estructura FOLDERSETTINGS . Si la vista cambia, por ejemplo, de iconos grandes a pequeños, actualice la estructura en consecuencia. Antes de cambiar de vistas, el Explorador de Windows llamará a IShellView::GetCurrentInfo para solicitar los valores FOLDERSETTINGS actuales para pasarlos al siguiente objeto de vista de carpeta.
Actualizar
El usuario puede asegurarse de que la vista de carpetas refleja el estado actual de la carpeta seleccionando Actualizar en el menú Ver o presionando la tecla F5. Cuando el usuario lo hace, el Explorador de Windows llama al método IShellView::Refresh . El objeto de vista de carpeta debe actualizar inmediatamente la visualización de la vista de carpetas.
SaveViewState
El Explorador de Windows llama al método IShellView::SaveViewState para pedir al objeto de vista de carpeta que guarde su estado de vista. A continuación, puede recuperar el estado la próxima vez que se vea la carpeta. La manera preferida de guardar un estado de vista es llamar al método IShellBrowser::GetViewStateStream . Este método devuelve una interfaz IStream que el objeto de vista de carpeta puede usar para guardar su estado. Al crear otra vista de carpeta, puede llamar al mismo método IShellBrowser::GetViewStateStream para obtener un puntero IStream que le permita leer la configuración guardada por las vistas de carpeta anteriores.
TranslateAcelerator
Cuando el usuario presiona una tecla de método abreviado, el Explorador de Windows pasa el mensaje al objeto de vista de carpetas llamando a IShellView::TranslateAccelerator. Devuelve S_FALSE para que el Explorador de Windows procese el mensaje. Si el objeto de vista de carpeta ha procesado el mensaje, devuelva S_OK.
Cuando la ventana de vista de carpetas tiene el foco, el Explorador de Windows llama a IShellView::TranslateAccelerator antes de procesar el mensaje. Dado que la mayoría de los mensajes suelen estar asociados con los comandos de barra de menús o barra de herramientas del Explorador de Windows, el objeto de vista de carpetas normalmente debería devolver S_FALSE. Después, el Explorador de Windows puede procesar el mensaje normalmente. Devuelve S_OK solo si el mensaje es específico de la carpeta y no quieres que el Explorador de Windows realice ningún procesamiento adicional. Si la vista de carpetas no tiene el foco, el Explorador de Windows procesa primero el mensaje. Llama a IShellBrowser::TranslateAcceleratorSB solo si no controla el mensaje.
Uso de IShellBrowser para comunicarse con el Explorador de Windows
El objeto de vista de carpetas usa la interfaz IShellBrowser para comunicarse con el Explorador de Windows con diversos fines, entre los que se incluyen:
- Modificar la barra de menús del Explorador de Windows
- Modificación de la barra de herramientas del Explorador de Windows
- Modificación de la barra de estado del Explorador de Windows
- Almacenar información específica de la vista
Modificar la barra de menús del Explorador de Windows
La barra de menús del Explorador de Windows permite al usuario iniciar una variedad de comandos. De forma predeterminada, la barra de menús solo admite comandos específicos del Explorador de Windows. El Explorador de Windows procesa los mensajes de WM_COMMAND relacionados y no se pasan al objeto de vista de carpeta. Sin embargo, puede modificar la barra de menús para incluir uno o varios elementos de menú específicos de la carpeta con IShellBrowser. El Explorador de Windows pasa los mensajes de WM_COMMAND asociados de esos elementos al procedimiento de ventana del objeto de carpeta para su procesamiento. También puede quitar o deshabilitar los comandos estándar que no se aplican a la aplicación.
Normalmente, los objetos de vista de carpetas modifican la barra de menús antes de que se muestre la vista de carpetas. Deben devolver la barra de menús a su estado original cuando se destruye la vista de carpetas. Es posible que también tenga que modificar la barra de menús cada vez que la vista de carpetas obtiene o pierde el foco.
Dado que el Explorador de Windows llama a IShellView::UIActivate cada vez que cambia el estado de la ventana de vista de carpetas, la modificación de la barra de menús normalmente se incluye en la implementación de ese método. El procedimiento básico para modificar la barra de menús del Explorador de Windows es:
- Llame a CreateMenu para crear un identificador de menú.
- Pase ese identificador de menú al Explorador de Windows llamando a IShellBrowser::InsertMenusSB. El Explorador de Windows rellenará su información de menú.
- Modifique el menú según sea necesario.
- Llame a IShellBrowser::SetMenuSB para que el Explorador de Windows muestre la barra de menús modificada.
El Explorador de Windows tiene seis menús emergentes en su barra de menús. Al igual que con todos los contenedores OLE, el menú del Explorador de Windows se divide en seis grupos: Archivo, Edición, Contenedor, Objeto, Ventana y Ayuda. En la tabla siguiente se enumeran los menús emergentes del Explorador de Windows y su grupo asociado, junto con los identificadores de menú.
Menú emergentes | ID | Grupo |
---|---|---|
Archivo | FCIDM_MENU_FILE | Archivo |
Editar | FCIDM_MENU_EDIT | Archivo |
Ver | FCIDM_MENU_VIEW | Contenedor |
Favoritos | FCIDM_MENU_FAVORITES | Contenedor |
Herramientas | FCIDM_MENU_TOOLS | Contenedor |
Ayuda | FCIDM_MENU_HELP | Periodo |
Al pasar el identificador de menú al Explorador de Windows llamando a IShellBrowser::InsertMenusSB, también debe pasar un puntero a una estructura OLEMENUGROUPWIDTHS cuyos miembros se han inicializado en cero.
Cuando se devuelve IShellBrowser::InsertMenusSB , el Explorador de Windows habrá agregado sus elementos de menú. A continuación, puede usar el identificador de menú devuelto con funciones de menú estándar de Windows, como InsertMenuItem para:
- Agregue elementos a los menús emergentes del Explorador de Windows.
- Modifique o elimine los elementos existentes en los menús emergentes del Explorador de Windows.
- Agregar nuevos menús emergentes.
Use los identificadores enumerados en la tabla para identificar los distintos menús emergentes del Explorador de Windows.
Nota
Para evitar conflictos con los identificadores de comando del Explorador de Windows, los identificadores de los elementos de menú que agregue deben estar comprendidos entre FCIDM_SHVIEWFIRST y FCIDM_SHVIEWLAST. Estos dos valores se definen en Shlobj.h.
Una vez que haya terminado de modificar el menú, llame a IShellBrowser::SetMenuSB para que el Explorador de Windows muestre la nueva barra de menús.
Una vez que se muestra inicialmente la vista de carpetas, el Explorador de Windows llama a IShellView::UIActivate cada vez que la vista de carpetas obtiene o pierde el foco. Si tiene algún elemento de menú que sea sensible al estado de la vista de carpetas, debe modificar el menú en consecuencia cada vez que cambie el estado. Por ejemplo, es posible que tenga un elemento de menú que actúe en un elemento de la vista de carpeta seleccionada por el usuario. Debe deshabilitar o quitar este elemento de menú cuando la vista de carpetas pierde el foco.
Cuando el Explorador de Windows llama a IShellView::UIActivate para indicar que la vista de carpetas se está desactivando, restaure la barra de menús a su estado original llamando a IShellBrowser::RemoveMenusSB.
Modificación de la barra de herramientas del Explorador de Windows
Además de modificar la barra de menús del Explorador de Windows, también puedes agregar botones a la barra de herramientas. Al igual que con la barra de menús, la modificación de la barra de herramientas suele formar parte de la implementación de IShellView::UIActivate . El procedimiento para agregar botones a la barra de herramientas del Explorador de Windows es:
- Agregue el mapa de bits del botón a la lista de imágenes de la barra de herramientas.
- Defina la cadena de texto del botón.
- Agregue el botón a la barra de herramientas.
Para agregar un mapa de bits a la lista de imágenes de una barra de herramientas, envíe a la barra de herramientas un mensaje de TB_ADDBITMAP llamando a IShellBrowser::SendControlMsg. Para especificar el control de barra de herramientas, establezca el parámetro id del método en FCW_TOOLBAR. Establezca wParam en el número de imágenes de botón del mapa de bits y lParam en la dirección de una estructura TBADDBITMAP . El índice de imagen se devuelve en el parámetro pret .
Hay dos maneras de definir una cadena para el botón:
- Asigne la cadena al miembro iString de la estructura TBBUTTON del botón.
- Llame a IShellBrowser::SendControlMsg para enviar el control de la barra de herramientas a un mensaje de TB_ADDSTRING . El parámetro wParam debe establecerse en cero y el parámetro lParam en la cadena. El índice de cadena se devuelve en el parámetro pret .
Para agregar el botón a la barra de herramientas, rellene una estructura TBBUTTON y pásela a IShellBrowser::SetToolbarItems. Al igual que con el menú, el identificador de comando debe estar entre FCIDM_SHVIEWFIRST y FCIDM_SHVIEWLAST. A continuación, la barra de herramientas anexará el botón a la derecha de los botones existentes.
Por ejemplo, el siguiente fragmento de código agrega un botón estándar a la barra de herramientas del Explorador de Windows con un identificador de comando de IDB_MYBUTTON.
TBADDBITMAP tbadbm;
int iButtonIndex;
TBBUTTON tbb;
tbadbm.hInst = g_hInstance; // The module's instance handle
tbadbm.nID = IDB_BUTTONIMAGE; // The bitmap's resource ID
psb->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1,
reinterpret_cast<LPARAM>(&tbadbm), &iButtonIndex);
psb->SendControlMsg(FCW_TOOLBAR, TB_ADDSTRING, NULL,
reinterpret_cast<LPARAM>(szLabel), &iStringIndex);
ZeroMemory(&tbb, sizeof(TBBUTTON));
tbb.iBitmap = iButtonIndex;
tbb.iCommand = IDB_MYBUTTON;
tbb.iString = iStringIndex;
tbb.fsState = TBSTATE_ENABLED;
tbb.fsStyle = TBSTYLE_BUTTON;
psb->SetToolbarItems(&tbb, 1, FCT_MERGE);
Para obtener más información sobre cómo controlar los controles de la barra de herramientas, consulte Controles de barra de herramientas.
Modificación de la barra de estado del Explorador de Windows
Puedes usar la barra de estado del Explorador de Windows para mostrar una variedad de información útil. Hay dos maneras de usar la barra de estado:
- Use IShellBrowser::SetStatusTextSB para mostrar una cadena de texto en la barra de estado.
- Envíe mensajes directamente al control de barra de estado con IShellBrowser::SendControlMsg.
El primer método es sencillo pero suficiente para muchos propósitos. Para mayor flexibilidad, puede enviar mensajes directamente al control de barra de estado llamando a IShellBrowser::SendControlMsg con el parámetro id establecido en FCW_STATUS. Para obtener más información sobre los controles de barra de estado, consulte Barras de estado.
Almacenar información específica de la vista
Cuando una vista está a punto de destruirse, a menudo resulta útil almacenar información como el estado o la configuración de la vista. El Explorador de Windows le pide que realice esta tarea llamando a IShellView::SaveViewState. La manera preferida de guardar información específica de la vista es llamar a IShellBrowser::GetViewStateStream. Este método proporciona una interfaz IStream que puede usar para almacenar la información. Puede usar cualquier formato de datos adecuado.