I. Dans la liste suivante quelle technologie d'interface utilisateur a été ajoutée à Windows 7 ?

La plate-forme de rubans de Windows est un système de présentation de commande riche qui fournit une alternative moderne aux menus et aux barres d'outils traditionnelles de Windows. Similaire aux fonctionnalités et à l'apparence de l'interface utilisateur de Microsoft Office 2007, la plate-forme de rubans Windows est composée d'une barre de commandes de rubans qui expose les principales caractéristiques d'une application à travers une série d'onglets en haut de la fenêtre de l'application et un système de menu contextuel.

Image non disponible

L'utilisation des rubans, tire profit du modèle MVC (Model View Controler).

En effet, pour profiter des rubans de Windows, il suffit :

  1. De partir d'un fichier au format XML, décrivant l'interface et les commandes
  2. De le compiler à l'aide d'un outil spécifique, UICC.exe afin de construire un fichier de ressources qui sera à incorporer dans l'application.
  3. De construire une classe qui permettra de l'initialiser et de réagir aux évènements
Image non disponible
Exemple de fichier XML
Sélectionnez
<Application xmlns='http://schemas.microsoft.com/windows/2009/Ribbon'>
  <Application.Commands>
    <Command Name="TabAccueil" Symbol="cmdTabAccueil" Id="30000">
      <Command.LabelTitle>
        <String Id ="200">Accueil</String>
      </Command.LabelTitle>
    </Command >
    <Command Name="GroupPrincipal"  Symbol="cmdGroupPrincipal" Id="30001" LabelTitle="Principal"/>
    <Command Name="MonBouton" Symbol="cmdMonBouton" Id="30002" LabelTitle="Mon Bouton">
      <Command.TooltipTitle>Mon Bouton</Command.TooltipTitle>
      <Command.TooltipDescription>Cliquez sur mon Bouton</Command.TooltipDescription>
      <Command.LargeImages>
        <Image Source="Button_Image.bmp"/>
      </Command.LargeImages>
    </Command>

  </Application.Commands>

  <Application.Views>
    <Ribbon>
      <Ribbon.Tabs>
        <Tab CommandName="TabAccueil">
          <Group CommandName="GroupPrincipal" SizeDefinition="TwoButtons">
            <Button CommandName="MonBouton"/>
            <ToggleButton CommandName="MonChoix"/>
          </Group>
        </Tab>
      </Ribbon.Tabs>
    </Ribbon>
  </Application.Views>
</Application>
Compilation du fichier XML
Sélectionnez
UICC.exe BalisesRuban.xml BaliseRuban.bml  /res:Rubanres.rc
Exemple de classe et d'initialisation de la plate-forme de rubans
Sélectionnez
class CApplication
	: public CComObjectRootEx<CComMultiThreadModel>
	, public IUIApplication
	, public IUICommandHandler
{
	private:
	    BOOL _fEnabled;
public:
	BEGIN_COM_MAP(CApplication)
		COM_INTERFACE_ENTRY(IUIApplication)
		COM_INTERFACE_ENTRY(IUICommandHandler)
	END_COM_MAP()

	STDMETHOD(OnViewChanged)(UINT32 nViewID, __in UI_VIEWTYPE typeID, __in IUnknown* pView, UI_VIEWVERB verb, INT32 uReasonCode)  
	{ 
		return E_NOTIMPL; 
	}
	STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, __in UI_COMMANDTYPE typeID, __deref_out IUICommandHandler** ppCommandHandler) 
	{ 
		if (nCmdID == cmdMonBouton || nCmdID == cmdMonChoix )
		{
			return QueryInterface(IID_PPV_ARGS(ppCommandHandler));
		}
		return E_NOTIMPL; 
	}

	STDMETHOD(OnDestroyUICommand)(UINT32 commandId, __in UI_COMMANDTYPE typeID, __in_opt IUICommandHandler* pCommandHandler) 
	{ 
		return E_NOTIMPL; 
	}
	STDMETHODIMP Execute(UINT nCmdID,
						UI_EXECUTIONVERB verb, 
						__in_opt const PROPERTYKEY* key,
						__in_opt const PROPVARIANT* ppropvarValue,
						__in_opt IUISimplePropertySet* pCommandExecutionProperties)
	{
		HRESULT hr = S_OK;
		
		switch (verb)
		{
		case UI_EXECUTIONVERB_EXECUTE:
			if (nCmdID == cmdMonBouton)
			{
			   MessageBox(NULL, L"Vous avez cliqué sur mon bouton !",L"La méthode Execute ", MB_OK);
			}
			break;
		}	
		return hr;
	}

HRESULT InitialisationRuban(HWND hWindowFrame)
{
	HRESULT hr = CoCreateInstance(CLSID_UIRibbonFramework, 
								  NULL, 
								  CLSCTX_INPROC_SERVER, 
								  IID_PPV_ARGS(&g_pFramework));

	CComObject<CApplication> *pApplication = NULL;
	CComObject<CApplication>::CreateInstance(&pApplication);
	g_pFramework->Initialize(hWindowFrame, pApplication);
	g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
	return 0;
}

Il est bien évidemment possible de mapper les commandes de rubans, sur les commandes des anciens menus afin d'éviter de tout recoder

Pour plus d'infos :