# Thursday, July 23, 2009

Depuis le Feature Pack (et SP1) de Visual C++ 2008, les MFC contiennent un ruban ("ribbon") similaire à celui que l'on trouve dans Office 2007. On pouvait écrire des applications en utilisant cette fonctionnalité des MFC, comme cet exemple :


Le contrôle "ribbon" des MFC

Il se murmurait à l'époque de la sortie de ce Service Pack, que l'interface de type Ruban serait très courante sous Windows 7, comme je l'écrivais ici il y a plus d'un an.

Eh bien Windows 7 contient un contrôle Ribbon par défaut, le "ScenicRibbon". Il n'a pas tout a fait le même look que celui des MFC. Le problème, c'est que le Ribbon de Windows 7 n'est pas le même que celui des MFC !


Le contrôle "Ribbon" de Windows 7

Ces deux éléments sont totalement distincts et ne se programment pas de la même façon. Celui de Windows 7 utilise un fichier XML pour décrire les onglets, boutons... Par exemple, pour créer deux bouton "Copier" et "Coller" dans un groupe :

   <Group CommandName="cmdEdit" SizeDefinition="TwoButtons">
      <
Button CommandName="cmdCopy" />
      <
Button CommandName="cmdPaste" />
   </
Group>

Le SDK de Windows 7 inclus un outil pour compiler ce fichier XML de description d'interface. Ca ressemble à du XAML, mais ce n'en est pas ! C'est une sorte de fichier Ressource en XML, utilisé en code natif ! La documentation du ScenicRibbon de Windows 7 est ici sur MSDN.

 

Par contre, pour ajouter un bouton ou un groupe dans le Ribbon des MFC, il faut écrire du code "en dur" dans le programme, comme par exemple :

   // Crer le panneau "Presse-papiers":
   strTemp.LoadString(IDS_RIBBON_CLIPBOARD);
   CMFCRibbonPanel* pPanelClipboard = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon(27));

   // Crée le bouton "Coller"
   strTemp.LoadString(IDS_RIBBON_PASTE);
   CMFCRibbonButton* pBtnPaste =
new
CMFCRibbonButton(ID_EDIT_PASTE, strTemp, 0, 0);
   pPanelClipboard->Add(pBtnPaste);

   // Crée le bouton "Couper"
   strTemp.LoadString(IDS_RIBBON_CUT);
   pPanelClipboard->Add(
new CMFCRibbonButton(ID_EDIT_CUT, strTemp, 1));

Le contrôle "Ribbon" devient presque incontournable. Celui de Windows 7 est beaucoup plus flexible à programmer. Il est quand même plus facile et souple de décrire une interface utilisateur en XML que d'écrire du code C++ en dur ! Au point que si une DLL redistribuable du Ribbon Windows 7 était disponible pour Vista et XP, on jetterait bien vite le Ribbon des MFC à la poubelle. Le problème est qu'apparamment le Scenic Ribbon ne sera disponible que pour Vista et 7, pas pour XP (http://channel9.msdn.com/pdc2008/PC14/).

Et, pour une fois, les programmeurs natifs C++ sont avantagés par rapport aux programmeurs Winform. Le framework .NET ne contient pas (encore) de ribbon. Mais Microsoft propose un Ribbon en add-in pour WPF, que l'on peut télécharger, en plus de .NET 3.5 : http://windowsclient.net/wpf/wpf35/wpf-35sp1-ribbon-walkthrough.aspx

Evidemment je ne mentionne pas les différents éditeurs de composants payants pour MFC (Codejock, BCG) ou .NET (Infragistics...) qui proposent des ribbons.

Tags  |  | 
 23 July 2009, 17:23