Compartir a través de


Creación de una aplicación de cinta de opciones

El marco de la cinta de opciones de Windows se compone de dos plataformas de desarrollo distintas, pero dependientes: un lenguaje de marcado basado en lenguaje xaml (Extensible Application Markup Language) para declarar controles y su diseño visual, y un conjunto de interfaces basadas en el modelo de objetos componentes (COM) de C++ para definir la funcionalidad de comandos y los enlaces de aplicación. Esta división de trabajo dentro de la arquitectura del marco de la cinta requiere que un desarrollador que quiera aprovechar las completas funcionalidades de interfaz de usuario que ofrece el marco de trabajo debe diseñar y describir la interfaz de usuario en el marcado y, a continuación, usar las interfaces COM del marco de la cinta para conectar el marco a la aplicación host.

Mapa de ruta de la cinta de opciones

Los aspectos visuales de una aplicación de cinta de opciones, como los controles que se muestran y dónde se colocan, se declaran en el marcado (consulte Declaración de comandos y controles con marcado de cinta de opciones). La lógica de comandos de la aplicación, como lo que sucede cuando se presiona un botón, se implementa en el código.

El proceso de implementación de una cinta de opciones y su incorporación en una aplicación de Windows requiere cuatro tareas básicas: escribir el marcado, compilar el marcado, escribir el código y compilar y vincular toda la aplicación.

En el diagrama siguiente se muestra el flujo de trabajo de una implementación típica de la cinta de opciones.

diagrama que muestra el flujo de trabajo para una implementación típica de la cinta de opciones.

En las secciones siguientes se describe este proceso con más detalle.

Escritura del marcado

Una vez diseñada la interfaz de usuario de la cinta de opciones, la primera tarea para un desarrollador de aplicaciones es describir la interfaz de usuario con marcado de la cinta de opciones.

Importante

El archivo de esquema de marcado del marco de la cinta, UICC.xsd, se instala con el Kit de desarrollo de software (SDK) de Microsoft Windows para Windows 7 y .NET Framework 4.0. Con la ruta de instalación estándar, el archivo se encuentra en la carpeta %ProgramFiles%\Microsoft SDKs\Windows\[número de versión]\Bin a la que pueden hacer referencia muchos editores XML para proporcionar sugerencias y autocompletar.

 

Los controles de la cinta de opciones, los comandos de la cinta de opciones (los elementos independientes del control que proporcionan la funcionalidad base para los controles de la cinta de opciones) y todas las relaciones visuales y de diseño de controles se declaran en el marcado. La estructura del marcado de la cinta de opciones resalta la distinción entre los controles de la cinta de opciones y los comandos a través de dos jerarquías de nodos principales: un árbol comandos y recursos y un árbol vistas .

Todos los contenedores y acciones expuestos por la cinta de opciones se declaran en el árbol Comandos y recursos . Cada elemento Command está asociado a un conjunto de recursos, según lo requiera el diseño de la interfaz de usuario.

Después de crear los comandos para una aplicación, declara los controles en el árbol Vistas y enlaza cada control a un comando para exponer la funcionalidad Comando. El marco de la cinta de opciones determina el posicionamiento real de los controles en función de la jerarquía control declarada aquí.

En el ejemplo de código siguiente se muestra cómo declarar un control Button, etiquetada como Exit application y asociarla a un comando Exit.

<Application xmlns="http://schemas.microsoft.com/windows/2009/Ribbon">
  <Application.Commands>
    <Command Name="cmdExit" LabelTitle="Exit application" />
  </Application.Commands>

  <Application.Views>
    <Ribbon>
      <Ribbon.Tabs>
        <Tab>
          <Group>
            <Button CommandName="cmdExit" />
          </Group>
        </Tab>
      </Ribbon.Tabs>
    </Ribbon>
  </Application.Views>
</Application>
        

Sugerencia

Aunque es posible usar cualquier extensión de nombre de archivo para el archivo de marcado de la cinta de opciones, .xml es la extensión recomendada que se usa en toda la documentación.

 

Compilación del marcado

Una vez creado el archivo de marcado de la cinta de opciones, el compilador de marcado de la cinta de opciones debe compilarlo en un formato binario, compilador de comandos de interfaz de usuario (UICC), que se incluye con el kit de desarrollo de software (SDK) de Windows. Una referencia a este archivo binario se pasa al método IUIFramework::LoadUI durante la inicialización del marco de la cinta por parte de la aplicación host.

UICC se puede ejecutar directamente desde una ventana de línea de comandos o agregarse como "Paso de compilación personalizado" en Visual Studio.

En la imagen siguiente se muestra el compilador de marcado UICC en la ventana shell de CMD del SDK de Windows 7.

captura de pantalla que muestra uicc.exe en una ventana de línea de comandos.

En la imagen siguiente se muestra UICC agregado como un paso de compilación personalizado en Visual Studio.

captura de pantalla que muestra uicc.exe agregado como un paso de compilación personalizado en Visual Studio.

UICC genera tres archivos: una versión binaria del marcado (.bml), un encabezado de definición de identificador (archivo .h) para exponer elementos de marcado a la aplicación host de la cinta y un script de definición de recursos (archivo .rc) para vincular los recursos de cadena y imagen de la cinta a la aplicación host en tiempo de compilación.

Para obtener más información sobre la compilación del marcado del marco de la cinta de opciones, consulte Compilación del marcado de la cinta de opciones.

Compilar la aplicación

Una vez diseñada e implementada la interfaz de usuario preliminar de una aplicación de cinta de opciones, el código de aplicación debe escribirse que inicialice el marco, consuma el marcado y enlace los comandos declarados en el marcado a los controladores de comandos adecuados de la aplicación.

Importante

Dado que el marco de la cinta de opciones está basado en COM, se recomienda que los proyectos de cinta usen el operador __uuidof() para hacer referencia a los GUID de las interfaces del marco de la cinta de opciones (IID). En aquellos casos en los que no es posible usar el operador __uuidof(), como cuando se usa un compilador que no es de Microsoft o la aplicación host está basada en C, la aplicación debe definir los IID, ya que no están incluidos en uuid.lib.

Si la aplicación define los IID, se deben usar los GUID especificados en UIRibbon.idl.

UIRibbon.idl se incluye como parte del Kit de desarrollo de software (SDK) de Windows y se puede encontrar en la ruta de instalación estándar de %ProgramFiles%\Microsoft SDKs\Windows\v7.0\Include.

 

Inicialización de la cinta de opciones

En el diagrama siguiente se muestran los pasos necesarios para implementar una aplicación de cinta de opciones sencilla.

diagrama que muestra los pasos necesarios para implementar una implementación sencilla de la cinta de opciones.

En los pasos siguientes se describe con detalle cómo implementar una aplicación de cinta de opciones sencilla.

  1. Cocreateinstance

    La aplicación llama a la función COM CoCreateInstance estándar con el identificador de clase de marco de la cinta de opciones para obtener un puntero al marco.

    IUIFramework* pFramework = NULL;
    HRESULT hr = ::CoCreateInstance(
                CLSID_UIRibbonFramework, 
                NULL,
                CLSCTX_INPROC_SERVER, 
                IID_PPV_ARGS(&pFramework));
    if (FAILED(hr))
    {
      return hr;
    }
    
  2. Initialize(hwnd, IUIApplication*)

    La aplicación llama a IUIFramework::Initialize, pasando dos parámetros: el identificador a la ventana de nivel superior que contendrá la cinta de opciones y un puntero a la implementación de IUIApplication que permite al marco realizar devoluciones de llamada a la aplicación.

    Importante
    El marco de la cinta de opciones se inicializa como un apartamento de un solo subproceso (STA).

     

    hr = pFramework->Initialize(hWndHost, pApplication);
    if (FAILED(hr))
    {
      return hr;
    }
    
  3. LoadUI(instance, resourceName)

    La aplicación llama a IUIFramework::LoadUI para enlazar el recurso de marcado. El primer parámetro de esta función es un identificador de la instancia de la aplicación Ribbon. El segundo parámetro es el nombre del recurso de marcado binario que se compiló anteriormente. Al pasar el marcado binario al marco de la cinta de opciones, la aplicación indica qué debe ser la estructura de la cinta y cómo se deben organizar los controles. También proporciona al marco un manifiesto de comandos para exponer (como Pegar, Cortar, Buscar), que usa el marco cuando realiza devoluciones de llamada relacionadas con comandos en tiempo de ejecución.

    hr = pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
    if (FAILED(hr))
    {
      return hr;
    }
    
  4. Devoluciones de llamada IUIApplication::OnCreateUICommand

    Una vez completados los pasos del 1 al 3, el marco de la cinta de opciones sabe qué comandos exponer en la cinta de opciones. Sin embargo, el marco todavía necesita dos cosas antes de que la cinta de opciones sea totalmente funcional: una manera de indicar a la aplicación cuándo se ejecutan los comandos y una manera de obtener recursos command, o propiedades, en tiempo de ejecución. Por ejemplo, si un cuadro combinado debe aparecer en la interfaz de usuario, el marco debe solicitar los elementos con los que rellenar el cuadro combinado.

    Estas dos partes de funcionalidad se controlan a través de la interfaz IUICommandHandler . En concreto, para cada comando declarado en el marcado binario (consulte el paso 3 anterior), el marco llama a IUIApplication::OnCreateUICommand para pedir a la aplicación un objeto IUICommandHandler para ese comando.

    Nota

    La interfaz IUICommandHandler permite enlazar un controlador de comandos a uno o varios comandos.

     

Como mínimo, la aplicación es necesaria para implementar códigos auxiliares de métodos IUIApplication que devuelven E_NOTIMPL como se muestra en el ejemplo siguiente.

STDMETHOD(OnViewChanged)(UINT32 viewId,
                         UI_VIEWTYPE typeID,
                         IUnknown *view,
                         UI_VIEWVERB verb,
                         INT32 uReasonCode)
{ 
  return E_NOTIMPL; 
}

STDMETHOD(OnCreateUICommand)(UINT32 commandId,
                             UI_COMMANDTYPE typeID,
                             IUICommandHandler **commandHandler)
{ 
  return E_NOTIMPL; 
}

STDMETHOD(OnDestroyUICommand)(UINT32 commandId,
                              UI_COMMANDTYPE typeID,
                              IUICommandHandler *commandHandler) 
{ 
  return E_NOTIMPL; 
}

En este momento, los archivos de recursos de marcado deben estar vinculados a la aplicación host mediante la inclusión de una referencia al archivo de definición de recursos de marcado (que contiene una referencia al archivo de encabezado de marcado) en el archivo de recursos de aplicación. Por ejemplo, una aplicación llamada RibbonApp con un archivo de recursos denominado ribbonUI.rc requiere la siguiente línea en el archivo RibbonApp.rc.

#include "ribbonUI.rc"

En función del compilador y del vinculador que se use, el script de definición de recursos también puede requerir la compilación antes de que se pueda compilar la aplicación de cinta de opciones. La herramienta de línea de comandos del compilador de recursos (RC) que se incluye con Microsoft Visual Studio y Windows SDK se puede usar para esta tarea.

Compilación de la aplicación

Una vez compilada la aplicación ribbon, se puede ejecutar y probar la interfaz de usuario. Si la interfaz de usuario requiere ajustes y no hay ningún cambio en ningún controlador de comandos asociado en el código de aplicación principal, revise el archivo de código fuente de marcado, vuelva a compilar el marcado con UICC.exe y vincule los nuevos archivos de recursos de marcado. Cuando se reinicia la aplicación, se muestra la interfaz de usuario modificada.

Todo esto es posible sin tocar el código de aplicación principal, una mejora significativa del desarrollo y la distribución de aplicaciones estándar.

Tiempo de ejecución Novedades y ejecuciones

La estructura de comunicación en tiempo de ejecución del marco de la cinta de opciones se basa en un modelo de llamada bidireccional o de inserción y extracción.

Este modelo permite al marco informar a la aplicación cuando se ejecuta un comando y permite que tanto el marco como la aplicación consulten, actualicen e invaliden los valores de propiedad y los recursos de la cinta de opciones. Esta funcionalidad se proporciona a través de una serie de interfaces y métodos.

El marco extrae información de propiedad actualizada de la aplicación Ribbon a través del método de devolución de llamada IUICommandHandler::UpdateProperty . Un identificador de comando y una clave de propiedad, que identifica la propiedad Command que se va a actualizar, se pasan al método que, a continuación, devuelve, o inserta, un valor para esa clave de propiedad en el marco.

El marco llama a IUICommandHandler::Execute cuando se ejecuta un comando, lo que identifica el identificador de comando y el tipo de ejecución que se produjo (UI_EXECUTIONVERB). Aquí es donde la aplicación especifica la lógica de ejecución de un comando.

En el diagrama siguiente se muestra la comunicación en tiempo de ejecución para la ejecución de comandos entre el marco y la aplicación.

diagrama que muestra un ejemplo de la comunicación en tiempo de ejecución entre el marco de la cinta de opciones y una aplicación host.

Nota:

No es necesario implementar las funciones IUICommandHandler::UpdateProperty e IUICommandHandler::Execute para mostrar inicialmente una cinta de opciones en una aplicación. Sin embargo, estos métodos son necesarios para asegurarse de que la aplicación funciona correctamente cuando el usuario ejecuta los comandos.

 

Compatibilidad con OLE

Una aplicación de cinta de opciones se puede configurar como un servidor OLE para admitir la activación OLE fuera del lugar.

Los objetos creados en una aplicación de servidor OLE mantienen su asociación con la aplicación de servidor cuando se insertan (pegadas o colocadas) en una aplicación cliente OLE (o contenedor). En la activación OLE fuera de contexto, al hacer doble clic en el objeto de la aplicación cliente se abre una instancia dedicada de la aplicación de servidor y se carga el objeto para su edición. Cuando se cierra la aplicación de servidor, todos los cambios realizados en el objeto se reflejan en la aplicación cliente.

Nota

El marco de la cinta de opciones no admite la activación OLE local. Los objetos creados en un servidor OLE basado en la cinta de opciones no se pueden editar desde dentro de la aplicación cliente OLE. Se requiere una instancia dedicada externa de la aplicación de servidor.

Declaración de comandos y controles con marcado de cinta

Directrices para la experiencia del usuario de la cinta

Proceso de diseño de cinta de opciones