# 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
Friday, September 18, 2009 2:54:17 AM (Romance Standard Time, UTC+01:00)
Le Scenic Ribbon sera effectivement backporte sous Vista uniquement. Le Ribbon MFC a quant a lui l'avantage de target aussi Windows 2000 et XP.

Le Ribbon MFC est clairement moins pratique a utiliser mais il doit etre possible de faire facilement un petit tool permettant de generer le code C++ a partir de pseudo-xml et donc d'avoir un minimum de souplesse a ce niveau !
Yannick
Thursday, October 08, 2009 4:49:22 AM (Romance Standard Time, UTC+01:00)
BCGSoft propose un éditeur de Ribbon. Je ne l'utilise pas car pas pratique pour la gestion des index d'icones.
Pierre
Comments are closed.