Creazione di un'applicazione della barra multifunzione

Il framework della barra multifunzione di Windows è costituito da due piattaforme di sviluppo distinte, ma dipendenti: un linguaggio di markup basato su XAML (Extensible Application Markup Language) per dichiarare controlli e il relativo layout visivo e un set di interfacce basato su COM (Component Object Model) C++ per definire le funzionalità dei comandi e gli hook dell'applicazione. Questa divisione del lavoro all'interno dell'architettura del framework della barra multifunzione richiede che uno sviluppatore che voglia sfruttare le funzionalità avanzate dell'interfaccia utente offerte dal framework deve progettare e descrivere l'interfaccia utente nel markup e quindi usare le interfacce COM del framework della barra multifunzione per connettere il framework all'applicazione host.

Roadmap della barra multifunzione

Gli aspetti visivi di un'applicazione della barra multifunzione, ad esempio i controlli visualizzati e la posizione in cui vengono inseriti, vengono dichiarati nel markup (vedere Dichiarazione di comandi e controlli con markup della barra multifunzione). La logica del comando dell'applicazione, ad esempio ciò che accade quando viene premuto un pulsante, viene implementata nel codice.

Il processo di implementazione di una barra multifunzione e incorporarlo in un'applicazione Windows richiede quattro attività di base: scrivere il markup, compilare il markup, scrivere il codice e compilare e collegare l'intera applicazione.

Il diagramma seguente illustra il flusso di lavoro per un'implementazione tipica della barra multifunzione.

diagramma che mostra il flusso di lavoro per un'implementazione tipica della barra multifunzione.

Le sezioni seguenti descrivono questo processo in modo più dettagliato.

Scrivere il markup

Dopo aver progettato l'interfaccia utente della barra multifunzione, la prima attività per uno sviluppatore di applicazioni consiste nel descrivere l'interfaccia utente con il markup della barra multifunzione.

Importante

Il file dello schema di markup del framework della barra multifunzione UICC.xsd viene installato con Microsoft Windows Software Development Kit (SDK) per Windows 7 e .NET Framework 4.0. Usando il percorso di installazione standard, il file si trova nella cartella %ProgramFiles%\Microsoft SDKs\Windows\[numero di versione]\Bin a cui è possibile fare riferimento da molti editor XML per fornire suggerimenti e completamento automatico.

 

I controlli della barra multifunzione, i comandi della barra multifunzione (gli elementi indipendenti dal controllo che forniscono la funzionalità di base per i controlli della barra multifunzione) e tutte le relazioni di layout e oggetti visivi del controllo vengono dichiarate nel markup. La struttura del markup della barra multifunzione evidenzia la distinzione tra i controlli della barra multifunzione e i comandi tramite due gerarchie di nodi primari: un albero Commands e Resources e un albero Views .

Tutti i contenitori e le azioni esposti dalla barra multifunzione vengono dichiarati nell'albero Comandi e risorse . Ogni elemento Command è associato a un set di risorse, come richiesto dalla progettazione dell'interfaccia utente.

Dopo aver creato i comandi per un'applicazione, dichiarare i controlli nell'albero Views e associare ogni controllo a un comando per esporre la funzionalità Command. Il framework della barra multifunzione determina il posizionamento effettivo dei controlli in base alla gerarchia di controllo dichiarata qui.

L'esempio di codice seguente illustra come dichiarare un controllo Button, etichettato Exit application e associarlo 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>
        

Suggerimento

Anche se è possibile usare qualsiasi estensione di file per il file di markup della barra multifunzione, .xml è l'estensione consigliata usata in tutta la documentazione.

 

Compilare il markup

Dopo aver creato il file di markup della barra multifunzione, deve essere compilato in un formato binario dal compilatore di markup della barra multifunzione, UI Command Compiler (UICC), incluso in Windows Software Development Kit (SDK). Un riferimento a questo file binario viene passato al metodo IUIFramework::LoadUI durante l'inizializzazione del framework della barra multifunzione dall'applicazione host.

UICC può essere eseguito direttamente da una finestra della riga di comando o aggiunto come "passaggio di compilazione personalizzato" in Visual Studio.

L'immagine seguente mostra il compilatore di markup UICC nella finestra della shell CMD di Windows 7 SDK.

screenshot che mostra uicc.exe in una finestra della riga di comando.

L'immagine seguente mostra l'aggiunta di UICC come passaggio di compilazione personalizzato in Visual Studio.

screenshot che mostra uicc.exe aggiunto come passaggio di compilazione personalizzato in Visual Studio.

UICC genera tre file: una versione binaria del markup (con estensione bml), un'intestazione di definizione ID (file con estensione h) per esporre gli elementi di markup all'applicazione host della barra multifunzione e uno script di definizione della risorsa (file rc) per collegare le risorse dell'immagine e delle stringhe della barra multifunzione all'applicazione host in fase di compilazione.

Per altri dettagli sulla compilazione del markup del framework della barra multifunzione, vedere Compilazione del markup della barra multifunzione.

Compilare l'applicazione

Dopo che l'interfaccia utente preliminare per un'applicazione della barra multifunzione è stata progettata e implementata nel markup, il codice dell'applicazione deve essere scritto che inizializza il framework, utilizza il markup e associa i comandi dichiarati nel markup ai gestori comandi appropriati nell'applicazione.

Importante

Poiché il framework della barra multifunzione è basato su COM, è consigliabile che i progetti della barra multifunzione usino l'operatore __uuidof() per fare riferimento ai GUID per le interfacce del framework della barra multifunzione(IID). In questi casi in cui non è possibile usare l'operatore __uuidof(), ad esempio quando viene usato un compilatore non Microsoft o l'applicazione host è basata su C, i ID devono essere definiti dall'applicazione perché non sono contenuti in uuid.lib.

Se gli ID sono definiti dall'applicazione, è necessario usare i GUID specificati in UIRibbon.idl.

UIRibbon.idl viene fornito come parte di Windows Software Development Kit (SDK) e si trova nel percorso di installazione standard di %ProgramFiles%\Microsoft SDKs\Windows\v7.0\Include.

 

Inizializzare la barra multifunzione

Il diagramma seguente illustra i passaggi necessari per implementare una semplice applicazione della barra multifunzione.

diagramma che mostra i passaggi necessari per implementare una semplice implementazione della barra multifunzione.

I passaggi seguenti descrivono in dettaglio come implementare una semplice applicazione della barra multifunzione.

  1. Cocreateinstance

    L'applicazione chiama la funzione COM CoCreateInstance standard con l'ID classe framework ribbon per ottenere un puntatore al framework.

    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*)

    L'applicazione chiama IUIFramework::Initialize, passando due parametri: l'handle alla finestra di primo livello che conterrà la barra multifunzione e un puntatore all'implementazione IUIApplication che consente al framework di eseguire callback all'applicazione.

    ! [Importante]
    Il framework della barra multifunzione viene inizializzato come apartment a thread singolo (STA).

     

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

    L'applicazione chiama IUIFramework::LoadUI per associare la risorsa di markup. Il primo parametro di questa funzione è un handle per l'istanza dell'applicazione della barra multifunzione. Il secondo parametro è il nome della risorsa di markup binaria compilata in precedenza. Passando il markup binario al framework della barra multifunzione, l'applicazione segnala la struttura della barra multifunzione e il modo in cui devono essere disposti i controlli. Fornisce inoltre al framework un manifesto di comandi da esporre (ad esempio Incolla, Taglia, Trova), che vengono usati dal framework quando esegue callback correlati ai comandi in fase di esecuzione.

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

    Al termine dei passaggi da 1 a 3, il framework della barra multifunzione conosce i comandi da esporre nella barra multifunzione. Tuttavia, il framework necessita ancora di due elementi prima che la barra multifunzione sia completamente funzionante: un modo per indicare all'applicazione quando i comandi vengono eseguiti e un modo per ottenere le risorse comando, o le proprietà, in fase di esecuzione. Ad esempio, se una casella combinata deve essere visualizzata nell'interfaccia utente, il framework deve richiedere gli elementi con cui popolare la casella combinata.

    Queste due funzionalità vengono gestite tramite l'interfaccia IUICommandHandler . In particolare, per ogni comando dichiarato nel markup binario (vedere il passaggio 3 precedente), il framework chiama IUIApplication::OnCreateUICommand per chiedere all'applicazione un oggetto IUICommandHandler per tale comando

    Nota

    L'interfaccia IUICommandHandler consente l'associazione di un gestore comandi a uno o più comandi.

     

Come minimo, l'applicazione deve implementare gli stub di IUIApplication che restituiscono E_NOTIMPL, come illustrato nell'esempio seguente.

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; 
}

A questo punto, i file di risorse di markup devono essere collegati all'applicazione host includendo un riferimento al file di definizione della risorsa di markup (che contiene un riferimento al file di intestazione di markup) nel file di risorse dell'applicazione. Ad esempio, un'applicazione denominata RibbonApp con un file di risorse denominato ribbonUI.rc richiede la riga seguente nel file RibbonApp.rc.

#include "ribbonUI.rc"

A seconda del compilatore e del linker in uso, lo script di definizione della risorsa può richiedere anche la compilazione prima della compilazione dell'applicazione della barra multifunzione. Lo strumento da riga di comando del compilatore di risorse (RC) fornito con Microsoft Visual Studio e Windows SDK può essere usato per questa attività.

Compilare l'applicazione

Dopo aver compilato l'applicazione della barra multifunzione, può essere eseguita e testata l'interfaccia utente. Se l'interfaccia utente richiede modifiche e non sono state apportate modifiche ai gestori di comandi associati nel codice dell'applicazione principale, rivedere il file di origine del markup, ricompilare il markup con UICC.exe e collegare i nuovi file di risorse di markup. Quando l'applicazione viene riavviata, viene visualizzata l'interfaccia utente modificata.

Tutto ciò è possibile senza toccare il codice dell'applicazione principale, un miglioramento significativo rispetto allo sviluppo e alla distribuzione di applicazioni standard.

Esecuzione di Aggiornamenti ed esecuzioni

La struttura di comunicazione in fase di esecuzione del framework della barra multifunzione si basa su un modello push e pull o un chiamante bidirezionale.

Questo modello consente al framework di informare l'applicazione quando viene eseguito un comando e consente sia al framework che all'applicazione di eseguire query, aggiornare e invalidare i valori delle proprietà e le risorse della barra multifunzione. Questa funzionalità viene fornita tramite una serie di interfacce e metodi.

Il framework esegue il pull delle informazioni aggiornate sulle proprietà dall'applicazione ribbon tramite il metodo di callback IUICommandHandler::UpdateProperty . Un ID comando e una chiave di proprietà, che identifica la proprietà Command da aggiornare, vengono passati al metodo che restituisce, o esegue il push, un valore per tale chiave di proprietà nel framework.

Il framework chiama IUICommandHandler::Execute quando viene eseguito un comando, identificando sia l'ID comando che il tipo di esecuzione che si è verificato (UI_EXECUTIONVERB). Questa è la posizione in cui l'applicazione specifica la logica di esecuzione per un comando.

Il diagramma seguente illustra la comunicazione di runtime per l'esecuzione dei comandi tra il framework e l'applicazione.

diagramma che mostra un esempio della comunicazione in fase di esecuzione tra il framework della barra multifunzione e un'applicazione host.

Nota

L'implementazione delle funzioni IUICommandHandler::UpdateProperty e IUICommandHandler::Execute non è necessaria per visualizzare inizialmente una barra multifunzione in un'applicazione. Tuttavia, questi metodi sono necessari per garantire che le funzioni dell'applicazione correttamente quando i comandi vengono eseguiti dall'utente.

 

Supporto OLE

Un'applicazione della barra multifunzione può essere configurata come server OLE per supportare l'attivazione OLE locale.

Gli oggetti creati in un'applicazione OLE Server mantengono l'associazione con l'applicazione server quando vengono inseriti (incollati o inseriti) in un'applicazione client OLE (o contenitore). Nell'attivazione OLE locale fare doppio clic sull'oggetto nell'applicazione client apre un'istanza dedicata dell'applicazione server e carica l'oggetto per la modifica. Quando l'applicazione server viene chiusa, tutte le modifiche apportate all'oggetto vengono riflesse nell'applicazione client.

Nota

Il framework della barra multifunzione non supporta l'attivazione OLE sul posto. Gli oggetti creati in un server OLE basato sulla barra multifunzione non possono essere modificati dall'applicazione client OLE. È necessaria un'istanza dedicata esterna dell'applicazione server.

Dichiarazione di comandi e controlli con markup della barra multifunzione

Linee guida per l'esperienza utente della barra multifunzione

Processo di progettazione della barra multifunzione