Abrir y guardar como cuadros de diálogo

Nota

La función GetOpenFileName se muestra en el ejemplo File.

[A partir de Windows Vista, los cuadros de diálogo Abrir y Guardar como comunes se han reemplazado por el cuadro de diálogo elemento común. Se recomienda usar common item dialog API en lugar de estos cuadros de diálogo de la biblioteca de cuadros de diálogo comunes.

El cuadro de diálogo Abrir permite al usuario especificar la unidad, el directorio y el nombre de un archivo o conjunto de archivos que se van a abrir. Para crear y mostrar un cuadro de diálogo Abrir , inicialice una estructura OPENFILENAME y pase la estructura a la función GetOpenFileName .

El cuadro de diálogo Guardar como permite al usuario especificar la unidad, el directorio y el nombre de un archivo que se va a guardar. Para crear y mostrar un cuadro de diálogo Guardar como , inicialice una estructura OPENFILENAME y pase la estructura a la función GetSaveFileName .

Los cuadros de diálogo Abrir y Guardar como de estilo explorador proporcionan características de interfaz de usuario similares al Explorador de Windows. Sin embargo, el sistema sigue admitiendo cuadros de diálogo Abrir y Guardar como de estilo antiguo para las aplicaciones que deben ser coherentes con la interfaz de usuario de estilo anterior.

Además de la diferencia de apariencia, los cuadros de diálogo estilo explorador y estilo antiguo difieren en su uso de plantillas personalizadas y procedimientos de enlace para personalizar los cuadros de diálogo. Sin embargo, los cuadros de diálogo estilo explorador y estilo anterior tienen el mismo comportamiento para las operaciones más básicas, como especificar un filtro de nombre de archivo, validar la entrada del usuario y obtener el nombre de archivo especificado por el usuario. Para obtener más información sobre los cuadros de diálogo estilo explorador y estilo antiguo, vea Abrir y guardar como personalización del cuadro de diálogo.

En la ilustración siguiente se muestra un cuadro de diálogo típico abrir de estilo explorador.

abrir archivo (cuadro de diálogo)

En la ilustración siguiente se muestra un cuadro de diálogo guardar como de estilo explorador típico.

cuadro de diálogo guardar archivo

Si el usuario especifica un nombre de archivo y hace clic en el botón Aceptar , GetOpenFileName o GetSaveFileName devuelve TRUE. El búfer al que apunta el miembro lpstrFile de la estructura OPENFILENAME contiene la ruta de acceso completa y el nombre de archivo especificados por el usuario.

Si el usuario cancela el cuadro de diálogo Abrir o Guardar como o se produce un error, la función devuelve FALSE. Para determinar la causa del error, llame a la función CommDlgExtendedError para recuperar el valor de error extendido. Si el búfer lpstrFile es demasiado pequeño para recibir el nombre completo, CommDlgExtendedError devuelve FNERR_BUFFERTOOSMALL y los dos primeros bytes del búfer al que apunta el miembro lpstrFile se establecen en un valor entero que especifica el tamaño necesario para recibir el nombre completo.

En esta sección se tratan los temas siguientes.

Nombres y directorios de archivos

La información de esta sección se aplica a los cuadros de diálogo Abrir y Guardar como de estilo anterior y estilo explorador.

Antes de llamar a las funciones GetOpenFileName o GetSaveFileName , el miembro lpstrFile de la estructura OPENFILENAME debe apuntar al búfer para recibir el nombre de archivo. El miembro nMaxFile debe especificar el tamaño, en caracteres, del búfer lpstrFile . Para una función ANSI, este es el número de bytes, pero para una función Unicode es el número de caracteres.

Si el usuario especifica un nombre de archivo y hace clic en el botón Aceptar , el cuadro de diálogo copia la unidad, el directorio y el nombre de archivo seleccionados en el búfer lpstrFile . La función también establece los miembros nFileOffset y nFileExtension en los desplazamientos, en caracteres, desde el inicio del búfer al nombre de archivo y a la extensión de nombre de archivo, respectivamente.

Para recuperar solo el nombre de archivo y la extensión, establezca el miembro lpstrFileTitle para que apunte a un búfer y establezca el miembro nMaxFileTitle en el tamaño, en caracteres, del búfer. Como alternativa, puede pasar el búfer lpstrFile en una llamada a la función GetFileTitle para obtener el nombre para mostrar del archivo seleccionado. Sin embargo, tenga en cuenta que el nombre de archivo que devuelve GetFileTitle incluye una extensión solo si es la preferencia del usuario para mostrar los nombres de archivo.

El cuadro de diálogo usa el directorio actual para el proceso de llamada como directorio inicial desde el que se muestran archivos y directorios. Use las funciones GetCurrentDirectory y SetCurrentDirectory para obtener y cambiar el directorio actual de un proceso. Para especificar un directorio inicial diferente sin cambiar el directorio actual, use el miembro lpstrInitialDir para especificar el nombre de un directorio. El cuadro de diálogo cambia automáticamente el directorio actual cuando el usuario selecciona una unidad o directorio diferente. Para evitar que el cuadro de diálogo cambie el directorio actual, establezca la marca OFN_NOCHANGEDIR . Esta marca no impide que el usuario cambie los directorios para buscar un archivo.

Para especificar una extensión de nombre de archivo predeterminada, use el miembro lpstrDefExt . Si el usuario especifica un nombre de archivo que no tiene una extensión, el cuadro de diálogo agrega la extensión predeterminada. Si especifica una extensión predeterminada y el usuario especifica un nombre de archivo con una extensión diferente, el cuadro de diálogo establece la marca OFN_EXTENSIONDIFFERENT .

Para permitir que el usuario seleccione más de un archivo de un directorio, establezca la marca OFN_ALLOWMULTISELECT . Para la compatibilidad con aplicaciones anteriores, el cuadro de diálogo de selección múltiple predeterminado usa la interfaz de usuario de estilo antiguo. Para mostrar un cuadro de diálogo de selección múltiple de estilo Explorador, también debe establecer la marca OFN_EXPLORER .

Si el usuario selecciona más de un archivo, el búfer al que apunta el miembro lpstrFile devuelve la ruta de acceso al directorio actual seguido de los nombres de archivo de los archivos seleccionados. El miembro nFileOffset es el desplazamiento al primer nombre de archivo y no se usa el miembro nFileExtension . En la tabla siguiente se describe la diferencia entre los cuadros de diálogo de estilo explorador y estilo antiguo al devolver varios nombres de archivo.

Estilo del cuadro de diálogo Descripción
Cuadros de diálogo de estilo explorador Las cadenas de directorio y nombre de archivo están separadas por NULL , con un carácter NULL adicional después del apellido del archivo. Este formato permite que los cuadros de diálogo de estilo explorador devuelvan nombres de archivo largos que incluyan espacios.
Cuadros de diálogo de estilo antiguo Las cadenas de directorio y nombre de archivo están separadas por espacios. Para los nombres de archivo con espacios, la función usa nombres de archivo cortos.

 

Puede usar la función FindFirstFile para convertir entre nombres de archivo largos y cortos.

Si especifica OFN_ALLOWMULTISELECT y el usuario selecciona solo un archivo, la cadena lpstrFile no tiene un separador entre la ruta de acceso y el nombre de archivo.

Filtros

La información de esta sección se aplica a los cuadros de diálogo Abrir y Guardar como de estilo explorador y estilo antiguo.

Puede proporcionar filtros de nombre de archivo para ayudar al usuario a limitar los nombres de archivo que muestra el cuadro de diálogo. Un filtro de nombre de archivo consta de un par de cadenas terminadas en NULL, una descripción y un patrón, una concatenada a la otra. El cuadro de diálogo muestra la descripción para permitir al usuario elegir qué filtro se va a usar; y usa el patrón para seleccionar los archivos que se van a mostrar.

Para especificar los filtros, establezca el miembro lpstrFilter de la estructura OPENFILENAME para que apunte a un búfer que contiene una matriz de pares de cadenas de filtro. La última cadena de la matriz debe estar seguida de un carácter nulo adicional.

Una cadena de patrón puede ser una combinación de caracteres de nombre de archivo válidos y el asterisco (*). El asterisco es un carácter comodín que representa cualquier combinación de caracteres de nombre de archivo válidos. El cuadro de diálogo muestra solo los archivos que coinciden con el patrón. Para especificar varios patrones para la misma descripción, debe usar un punto y coma (;) para separar los patrones. Tenga en cuenta que los caracteres de espacio de la cadena de patrón pueden generar resultados inesperados.

El fragmento de código siguiente especifica dos filtros. El filtro con la descripción "Source" tiene dos patrones. Si el usuario selecciona este filtro, el cuadro de diálogo muestra solo los archivos que tienen . C y . Extensiones CXX. Tenga en cuenta que, en el lenguaje de programación C, una cadena entre comillas dobles termina en null.

OPENFILENAME ofn;       // common dialog box structure

ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;

El miembro nFilterIndex de la estructura OPENFILENAME especifica un índice que indica qué filtro usa inicialmente el cuadro de diálogo. El primer filtro del búfer tiene el índice 1, el segundo 2, etc. Si el usuario cambia el filtro mientras usa el cuadro de diálogo, el miembro nFilterIndex se establece en el índice del filtro seleccionado al devolver.

Puede crear un filtro personalizado estableciendo el miembro lpstrCustomFilter en la dirección de un búfer que contiene un único filtro y estableciendo el miembro nMaxCustFilter en el tamaño del búfer, en caracteres o bytes. El cuadro de diálogo siempre coloca el filtro personalizado al principio de la lista de filtros y, de vuelta, siempre actualiza la parte de patrón del filtro con el patrón del filtro seleccionado por el usuario.

En el caso de los cuadros de diálogo de estilo explorador, la extensión predeterminada puede cambiar si el usuario selecciona un filtro diferente. Si el usuario selecciona un filtro cuyo primer patrón es del formulario *. xxx (es decir, la extensión no incluye un carácter comodín), el cuadro de diálogo usa xxx como extensión predeterminada. Esto solo ocurre si especificó una extensión predeterminada en el miembro lpstrDefExt de la estructura OPENFILENAME . Por ejemplo, si el usuario selecciona "Source\0*. C;*. Filtro CXX\0", la extensión predeterminada cambia a "C". Sin embargo, si ha definido el filtro como "Source\0*. C*\0", la extensión predeterminada no cambiaría porque la extensión incluye un carácter comodín.

El mensaje de notificación CDN_INCLUDEITEM proporciona otra manera de filtrar los nombres que muestra el cuadro de diálogo. Para usar este mensaje, proporcione un procedimiento de enlace OFNHookProc y especifique la marca OFN_ENABLEINCLUDENOTIFY en la estructura OPENFILENAME al crear el cuadro de diálogo. Cada vez que el usuario abre una carpeta, el cuadro de diálogo envía una notificación CDN_INCLUDEITEM al procedimiento de enlace para cada elemento de la carpeta recién abierta. El valor devuelto del procedimiento de enlace indica si el cuadro de diálogo debe mostrar el elemento en la lista de elementos de la carpeta.

Validación de archivos y directorios

Excepto como se indica, la información de esta sección se aplica a los cuadros de diálogo Abrir y Guardar como estilo del explorador.

El cuadro de diálogo valida automáticamente los nombres de archivo tipados por el usuario para asegurarse de que los nombres solo contienen caracteres válidos. Para invalidar la validación de caracteres de nombre de archivo, establezca la marca OFN_NOVALIDATE .

Para forzar el cuadro de diálogo a comprobar que el usuario especificó el nombre de un archivo existente, establezca la marca de OFN_FILEMUSTEXIST . Para forzar la comprobación de que existe la ruta de acceso especificada, establezca la marca OFN_PATHMUSTEXIST . Si establece la marca OFN_CREATEPROMPT , el cuadro de diálogo solicita al usuario permiso para crear un archivo inexistente. Si se establece esta marca y el usuario elige crear un nuevo archivo, se cierra el cuadro de diálogo y la función devuelve el nombre especificado. De lo contrario, el cuadro de diálogo permanece abierto.

Al usar el cuadro de diálogo Guardar como , puede dirigir el cuadro de diálogo para solicitar al usuario permiso para sobrescribir un archivo existente estableciendo la marca OFN_OVERWRITEPROMPT .

De forma predeterminada, el cuadro de diálogo crea un archivo de prueba de longitud cero para determinar si se puede crear un nuevo archivo en el directorio seleccionado. Para evitar la creación de este archivo de prueba, establezca la marca OFN_NOTESTFILECREATE .

Si habilita un procedimiento de enlace, el cuadro de diálogo notifica al procedimiento de enlace cuando se produce una infracción de uso compartido de red para el nombre de archivo especificado por el usuario. Si establece la marca OFN_EXPLORER , el cuadro de diálogo envía el mensaje CDN_SHAREVIOLATION al procedimiento de enlace. Si no establece OFN_EXPLORER, el cuadro de diálogo envía el mensaje registrado SHAREVISTRING al procedimiento de enlace. Para evitar que el cuadro de diálogo envíe notificaciones para infracciones de uso compartido, establezca la marca de OFN_SHAREAWARE .

Si el usuario activa la casilla de verificación de solo lectura, el cuadro de diálogo establece la marca OFN_READONLY devuelta. Para ocultar la casilla Abrir como solo lectura, establezca la marca OFN_HIDEREADONLY . Para evitar que el cuadro de diálogo devuelva nombres de archivos existentes que tengan el atributo de solo lectura, establezca la marca OFN_NOREADONLYRETURN .

Para evitar que el cuadro de diálogo desreferenciar archivos de vínculo, establezca el valor de OFN_NODEREFERENCELINKS . En este caso, el cuadro de diálogo devuelve el nombre del archivo de vínculo en lugar del nombre del archivo al que hace referencia el archivo de vínculo.

Abrir y guardar como personalización del cuadro de diálogo

Puede personalizar un cuadro de diálogo Abrir o Guardar como proporcionando un procedimiento de enlace, una plantilla personalizada o ambos. Sin embargo, las versiones de estilo explorer y estilo antiguo de los cuadros de diálogo difieren en su uso de plantillas personalizadas y procedimientos de enlace.

Para obtener información sobre cómo personalizar un cuadro de diálogo de estilo explorador, vea Procedimientos de enlace de estilo explorador, plantillas personalizadas de estilo explorador e identificadores de control de estilo explorador. Para obtener información sobre cómo personalizar un cuadro de diálogo de estilo antiguo, vea Personalizar Old-Style cuadros de diálogo.

En la tabla siguiente se resumen las diferencias entre los dos estilos.

Personalización Descripción
Procedimiento hook de estilo explorador El procedimiento de enlace recibe mensajes de notificación enviados desde el cuadro de diálogo común y los mensajes de los controles adicionales que haya definido especificando una plantilla de diálogo secundaria. El procedimiento de enlace no recibe mensajes para los controles estándar del cuadro de diálogo predeterminado.
Plantilla personalizada de estilo explorador El sistema usa la plantilla personalizada para crear un cuadro de diálogo secundario. La plantilla puede definir controles adicionales y puede especificar la ubicación del clúster de controles estándar. La plantilla personalizada no reemplaza la plantilla predeterminada.
Procedimiento Hook de estilo antiguo El procedimiento de enlace recibe todos los mensajes enviados al cuadro de diálogo, incluidos los mensajes para los controles estándar y los controles personalizados. El procedimiento de enlace también recibe mensajes registrados enviados desde el cuadro de diálogo común.
Plantilla personalizada de estilo anterior La plantilla personalizada reemplaza la plantilla predeterminada. Cree la plantilla personalizada modificando la plantilla predeterminada especificada en el archivo Fileopen.dlg.

 

El título predeterminado para los cuadros de diálogo de estilo explorador y estilo antiguo es "Abrir" o "Guardar como". Para cambiar el título, especifique el nuevo título en el miembro lpstrTitle de la estructura OPENFILENAME .

Los HKEY_CURRENT_USER subárbol del Registro de un usuario pueden contener valores que personalizan el contenido de los cuadros de diálogo Abrir y Guardar como de estilo explorador. Estas entradas del Registro afectan solo a los cuadros de diálogo que se muestran para el usuario asociado al subárbol del Registro.

Para ocultar las características de los cuadros de diálogo Abrir y Guardar como de estilo explorador, un administrador puede establecer los valores de la tabla siguiente en esta subclave:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
Nombre del valor Valor Significado
NoPlacesBar 1 Oculta la barra de lugares.
NoFileMRU 1 Oculta la lista Usados más recientemente (MRU).
NoBackButton 1 Oculta el botón Atrás .

 

El contenido de la barra Lugares viene determinado por el contenido de la subclave siguiente:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Comdlg32
                     Placesbar

Actualmente, solo puede haber cinco entradas en esta clave y el índice de valor o nombre es de base cero. Los nombres de las entradas deben ser Place0, Place1, Place2,Place3 y Place4. Los valores de las entradas pueden ser REG_DWORD, REG_SZ o REG_EXPAND_SZ valores que identifican las ubicaciones que se van a incluir en la barra de lugares.

Tipo de valor Significado
REG_DWORD Valor CSIDL que identifica una carpeta. Para obtener una lista de los valores de CSIDL, consulte Valores de CSIDL.
REG_SZ o REG_EXPAND_SZ Cadena terminada en null que especifica una ruta de acceso válida.

 

Procedimientos de enlace de Explorer-Style

Puede personalizar un cuadro de diálogo Abrir o Guardar como de estilo explorador proporcionando un procedimiento de enlace, una plantilla personalizada o ambas. Si proporciona un procedimiento de enlace para un cuadro de diálogo de estilo explorador, el sistema crea un cuadro de diálogo que es un elemento secundario del cuadro de diálogo predeterminado. El procedimiento de enlace actúa como procedimiento de diálogo para el cuadro de diálogo secundario. Este cuadro de diálogo secundario se basa en la plantilla personalizada o en una plantilla predeterminada si no se proporciona ninguna. Para obtener más información, vea Plantillas personalizadas de estilo explorador.

Para habilitar un procedimiento de enlace para un cuadro de diálogo Abrir o Guardar como de estilo explorador, use la estructura OPENFILENAME al crear el cuadro de diálogo. Establezca las marcas OFN_ENABLEHOOK y OFN_EXPLORER en el miembro Flags y especifique la dirección de un procedimiento de enlace OFNHookProc en el miembro lpfnHook . Si proporciona un procedimiento de enlace y omite la marca de OFN_EXPLORER , debe usar un procedimiento de enlace OFNHookProcOldStyle y obtendrá la interfaz de usuario de estilo antiguo. Para obtener más información, vea Personalización de cuadros de diálogo de Old-Style.

Un procedimiento de enlace de estilo explorador recibe una variedad de mensajes mientras el cuadro de diálogo está abierto. Entre ellas, se incluyen las siguientes:

  • Mensaje WM_INITDIALOG y otros mensajes de cuadro de diálogo estándar, como el mensaje de color de control WM_CTLCOLORDLG .
  • Un conjunto de mensajes de notificación de WM_NOTIFY que indican las acciones realizadas por el usuario u otros eventos del cuadro de diálogo.
  • Mensajes para cualquier control adicional que haya definido especificando una plantilla de diálogo secundaria.

Además, hay un conjunto de mensajes que puede enviar a un cuadro de diálogo de estilo explorador para obtener información o para controlar el comportamiento y la apariencia del cuadro de diálogo.

Si proporciona un procedimiento de enlace para un cuadro de diálogo de estilo explorador, el procedimiento de cuadro de diálogo predeterminado crea un cuadro de diálogo secundario cuando el procedimiento de diálogo predeterminado está procesando su mensaje de WM_INITDIALOG . El procedimiento de enlace actúa como procedimiento de diálogo para el cuadro de diálogo secundario. En este momento, el procedimiento de enlace recibe su propio mensaje de WM_INITDIALOG con el parámetro lParam establecido en la dirección de la estructura OPENFILENAME usada para inicializar el cuadro de diálogo. Una vez que el cuadro de diálogo secundario termine de procesar su propio mensaje de WM_INITDIALOG , el procedimiento de diálogo predeterminado mueve los controles estándar, si es necesario, para dejar espacio para los controles adicionales del cuadro de diálogo secundario. A continuación, el procedimiento de diálogo predeterminado envía el mensaje de notificación CDN_INITDONE al procedimiento de enlace.

El procedimiento de enlace recibe WM_NOTIFY mensajes de notificación que indican las acciones realizadas por el usuario en el cuadro de diálogo. Puede usar algunos de estos mensajes para controlar el comportamiento del cuadro de diálogo. Por ejemplo, el procedimiento de enlace recibe el mensaje CDN_FILEOK cuando el usuario elige un nombre de archivo y hace clic en el botón Aceptar . En respuesta a este mensaje, el procedimiento de enlace puede usar la función SetWindowLong para rechazar el nombre seleccionado y forzar que el cuadro de diálogo permanezca abierto.

El parámetro lParam para cada mensaje WM_NOTIFY es un puntero a una estructura OFNOTIFY o OFNOTIFYEX que define la acción. El miembro de código del encabezado de esta estructura contiene uno de los siguientes mensajes de notificación.

Mensaje Significado
CDN_FILEOK El usuario ha clic en el botón Aceptar ; el cuadro de diálogo está a punto de cerrarse.
CDN_FOLDERCHANGE El usuario abrió una nueva carpeta o directorio.
CDN_HELP El usuario ha clic en el botón Ayuda .
CDN_INCLUDEITEM Determina si se debe mostrar un elemento. Cuando el usuario abre una nueva carpeta o directorio, el sistema envía esta notificación para cada elemento de la carpeta o directorio. El sistema envía esta notificación solo si se estableció la marca OFN_ENABLEINCLUDENOTIFY .
CDN_INITDONE El sistema ha terminado de inicializar el cuadro de diálogo y el cuadro de diálogo ha terminado de procesar el mensaje WM_INITDIALOG . Además, el sistema ha terminado de organizar los controles en el cuadro de diálogo común para dejar espacio a los controles del cuadro de diálogo secundario (si existe).
CDN_SELCHANGE El usuario seleccionó un nuevo archivo o carpeta de la lista de archivos.
CDN_SHAREVIOLATION El cuadro de diálogo común encontró una infracción de uso compartido en el archivo a punto de devolverse.
CDN_TYPECHANGE El usuario seleccionó un nuevo tipo de archivo de la lista de tipos de archivo.

 

Estos mensajes WM_NOTIFY reemplazan los mensajes registrados FILEOKSTRING, LBSELCHSTRING, SHAREVISTRING y HELPMSGSTRING usados por versiones anteriores de los cuadros de diálogo Abrir y Guardar como . Sin embargo, el procedimiento de enlace también recibe el mensaje reemplazado después del mensaje de WM_NOTIFY si el procesamiento del WM_NOTIFY no usa SetWindowLong para establecer un valor distinto de cero DWL_MSGRESULT .

Para recuperar información sobre el estado del cuadro de diálogo o para controlar el comportamiento y la apariencia del cuadro de diálogo, el procedimiento de enlace puede enviar los siguientes mensajes al cuadro de diálogo.

Mensaje Significado
CDM_GETFILEPATH Recupera la ruta de acceso y el nombre de archivo del archivo seleccionado.
CDM_GETFOLDERIDLIST Recupera la lista de identificadores de elemento correspondiente a la carpeta actual que el cuadro de diálogo tiene abierta. Para obtener más información sobre las listas de identificadores de elementos, vea Introducción al espacio de nombres de Shell.
CDM_GETFOLDERPATH Recupera la ruta de acceso de la carpeta o directorio actual del cuadro de diálogo.
CDM_GETSPEC Recupera el nombre de archivo (sin incluir la ruta de acceso) del archivo seleccionado actualmente en el cuadro de diálogo.
CDM_HIDECONTROL Oculta el control especificado.
CDM_SETCONTROLTEXT Establece el texto del control especificado.
CDM_SETDEFEXT Establece la extensión de nombre de archivo predeterminada para el cuadro de diálogo.

 

plantillas personalizadas de Explorer-Style

Para definir controles adicionales para un cuadro de diálogo Abrir o Guardar como de estilo Explorador, use la estructura OPENFILENAME para especificar una plantilla para un cuadro de diálogo secundario que contenga los controles adicionales. Si la plantilla de diálogo secundaria es un recurso de una aplicación o biblioteca de vínculos dinámicos, establezca la marca OFN_ENABLETEMPLATE en el miembro Flags y use los miembros hInstance y lpTemplateName de la estructura para identificar el módulo y el nombre del recurso. Si la plantilla ya está en memoria, establezca la marca OFN_ENABLETEMPLATEHANDLE y use el miembro hInstance para identificar el objeto de memoria que contiene la plantilla. Al proporcionar una plantilla de cuadro de diálogo secundario para un cuadro de diálogo de estilo Explorador, también debe establecer la marca OFN_EXPLORER ; de lo contrario, el sistema supone que está proporcionando una plantilla de reemplazo para un cuadro de diálogo de estilo anterior. Normalmente, si proporciona controles adicionales, también debe proporcionar un procedimiento de enlace de estilo Explorador para procesar los mensajes de los nuevos controles.

Puede crear la plantilla del cuadro de diálogo secundario como hace con cualquier otra plantilla, salvo que debe especificar los estilos de WS_CHILD y WS_CLIPSIBLINGS y debe especificar los estilos DS_3DLOOK y DS_CONTROL . El sistema requiere el estilo de WS_CHILD porque la plantilla define un cuadro de diálogo secundario del cuadro de diálogo Abrir o Guardar como predeterminado. El estilo WS_CLIPSIBLINGS garantiza que el cuadro de diálogo secundario no pinte sobre ninguno de los controles del cuadro de diálogo predeterminado. El estilo DS_3DLOOK garantiza que la apariencia de los controles del cuadro de diálogo secundario sea coherente con los controles del cuadro de diálogo predeterminado. El estilo de DS_CONTROL se asegura de que el usuario puede usar la pestaña y otras teclas de navegación para moverse entre todos los controles, predeterminados o personalizados, en el cuadro de diálogo personalizado.

Para dejar espacio para los nuevos controles, el sistema expande el cuadro de diálogo predeterminado por el ancho y el alto del cuadro de diálogo personalizado. De forma predeterminada, todos los controles del cuadro de diálogo personalizado se colocan debajo de los controles del cuadro de diálogo predeterminado. Sin embargo, puede invalidar este posicionamiento predeterminado si incluye un control de texto estático en la plantilla del cuadro de diálogo personalizado y le asigna el valor del identificador de control de stc32. (Este valor se define en el archivo de encabezado Dlgs.h). En este caso, el sistema usa el control como punto de referencia para determinar dónde colocar los nuevos controles. Todos los controles nuevos situados encima y a la izquierda del control stc32 se colocan la misma cantidad por encima y a la izquierda de los controles en el cuadro de diálogo predeterminado. Los nuevos controles situados debajo y a la derecha del control stc32 se colocan debajo y a la derecha de los controles predeterminados. En general, cada nuevo control se coloca para que tenga la misma posición con respecto a los controles predeterminados que tenía al control stc32 . Para dejar espacio para estos nuevos controles, el sistema agrega espacio a la izquierda, derecha, inferior y superior del cuadro de diálogo predeterminado según sea necesario.

El sistema requiere el procedimiento de enlace para procesar todos los mensajes destinados al cuadro de diálogo personalizado y, por tanto, envía los mismos mensajes de ventana al procedimiento de enlace que a cualquier otro procedimiento de cuadro de diálogo. Por ejemplo, el procedimiento de enlace recibe WM_COMMAND mensajes cuando el usuario hace clic en los controles de botón del cuadro de diálogo personalizado. El procedimiento de enlace es responsable de inicializar estos controles y recuperar valores de los controles cuando se cierra el cuadro de diálogo. Tenga en cuenta que cuando el procedimiento de enlace recibe el mensaje WM_INITDIALOG , el sistema aún no ha movido los controles a sus posiciones finales.

El procedimiento de cuadro de diálogo predeterminado controla los mensajes de todos los controles del cuadro de diálogo predeterminado, pero el procedimiento de enlace recibe los mensajes de notificación para las acciones del usuario en estos controles, tal como se describe en Procedimientos de enlace de estilo explorador.

identificadores de control de Explorer-Style

El Kit de desarrollo de software (SDK) de Windows proporciona la plantilla de cuadro de diálogo predeterminada para los cuadros de diálogo de estilo antiguo, pero no incluye la plantilla predeterminada para los cuadros de diálogo de estilo explorador. Esto se debe a que los cuadros de diálogo de estilo explorador permiten agregar sus propios controles, pero no admiten la modificación de la plantilla para los controles estándar. Sin embargo, en algunos casos, es posible que tenga que conocer los identificadores de control usados en las plantillas predeterminadas. Por ejemplo, los mensajes CDM_HIDECONTROL y CDM_SETCONTROLTEXT requieren un identificador de control.

En la tabla siguiente se muestran los identificadores de los controles estándar en los cuadros de diálogo Abrir y Guardar como de estilo Explorador. Los identificadores son constantes definidas en Dlgs.h y Winuser.h.

Identificador de control Descripción del control
chx1 Casilla de verificación de solo lectura
cmb1 Cuadro combinado desplegable que muestra la lista de filtros de tipo de archivo
stc2 Etiqueta para el cuadro combinado cmb1
cmb2 Cuadro combinado desplegable que muestra la unidad o carpeta actual y que permite al usuario seleccionar una unidad o carpeta para abrirla.
stc4 Etiqueta del cuadro combinado cmb2
cmb13 Cuadro combinado desplegable que muestra el nombre del archivo actual, permite al usuario escribir el nombre de un archivo para abrirlo y seleccionar un archivo que se ha abierto o guardado recientemente. Esto es para aplicaciones compatibles con el Explorador anteriores sin plantilla de enlace o cuadro de diálogo. Compare con edt1.
edt1 Control de edición que muestra el nombre del archivo actual o permite al usuario escribir el nombre del archivo que se va a abrir. Compare con cmb13.
stc3 Etiqueta para el cuadro combinado cmb13 y el control de edición edt1
lst1 Cuadro de lista que muestra el contenido de la unidad o carpeta actual
stc1 Etiqueta para el cuadro de lista lst1
IDOK Botón de comando Aceptar (botón de inserción)
IDCANCEL Botón de comando Cancelar (botón de inserción)
pshHelp El botón de comando Ayuda (botón de inserción)

 

Personalizar cuadros de diálogo Old-Style

Puede personalizar un cuadro de diálogo Abrir o Guardar como de estilo antiguo proporcionando un procedimiento de enlace OFNHookProcOldStyle que recibe mensajes o notificaciones destinados al procedimiento predeterminado del cuadro de diálogo. También puede proporcionar una plantilla personalizada para usarla en lugar de la plantilla predeterminada. Los procedimientos de enlace y las plantillas que se usan con los cuadros de diálogo de estilo antiguo son similares a los que se usan con los otros cuadros de diálogo comunes. Para obtener más información, vea Procedimientos de enlace para cuadros de diálogo comunes y plantillas personalizadas.

Para habilitar un procedimiento de enlace para un cuadro de diálogo Abrir o Guardar como de estilo antiguo, use la estructura OPENFILENAME al crear el cuadro de diálogo. Establezca la marca OFN_ENABLEHOOK en el miembro Flags y especifique la dirección de un procedimiento de enlace OFNHookProcOldStyle en el miembro lpfnHook . El procedimiento del cuadro de diálogo envía un mensaje WM_INITDIALOG al procedimiento de enlace con el parámetro Param establecido en la dirección de la estructura OPENFILENAME utilizada para inicializar el cuadro de diálogo.

Puede usar la estructura OPENFILENAME para especificar una plantilla personalizada para el cuadro de diálogo Abrir o Guardar como para usar en lugar de la plantilla predeterminada. Si la plantilla personalizada es un recurso de una aplicación o biblioteca de vínculos dinámicos, establezca la marca OFN_ENABLETEMPLATE en el miembro Flags y use los miembros hInstance y lpTemplateName de la estructura para identificar el módulo y el nombre del recurso. Si la plantilla personalizada ya está en memoria, establezca la marca OFN_ENABLETEMPLATEHANDLE y use el miembro hInstance para identificar el objeto de memoria que contiene la plantilla. Cree la plantilla personalizada modificando la plantilla predeterminada especificada en el archivo Fileopen.dlg. Los identificadores de control usados en las plantillas de diálogo buscar y reemplazar predeterminadas se definen en el archivo Dlgs.h.

De forma predeterminada, las funciones GetOpenFileName y GetSaveFileName muestran los cuadros de diálogo estilo explorador. Si desea mostrar un cuadro de diálogo de estilo antiguo, debe proporcionar un procedimiento de enlace OFNHookProcOldStyle y asegurarse de que la marca OFN_EXPLORER no esté establecida en el miembro Flags de la estructura OPENFILENAME .

Si establece la marca OFN_EXPLORER , el sistema trata un procedimiento de enlace o una plantilla personalizada como una personalización de estilo Explorador. Para obtener información sobre cómo personalizar un cuadro de diálogo de estilo explorador, vea Plantillas personalizadas de estilo explorador.

Consulte también