Developpez.com - C++
X

Choisissez d'abord la catégorieensuite la rubrique :


Visual C++ 2010 premières impressions

Date de publication : 23/04/2010 , Date de mise à jour : 04/05/2010

Par Patrick OTTAVI MVP Visual C++ (Site) (Blog)
 

Depuis quelques mois je travaille avec Visual Studio 2010 dans un premier temps avec les bêta 1 et 2 et maintenant avec la RC disponible depuis les TechDays 2010.
Mon environnement de travail est un PC sous Seven 64 bits avec deux écrans, 2 Go de mémoire et un processeur Core Duo 6600 à 2,40 GHz.
L'installation n'a pas causé de problème particulier et cela fait presque deux mois que je travaille sur des projets migrés de Visual Studio 2008.

       Version PDF (Miroir)   Version hors-ligne (Miroir)
Viadeo Twitter Facebook Share on Google+        



I. Comment se comporte cette version en termes de rapidité ?
II. Vraiment finie la galère du fichier .ncb et de la perte de l'IntelliSense ?
III. Puis-je distribuer mon programme MFC ou C++ avec les DLL systèmes associées ?
IV. Quelles sont les nouveautés de l'éditeur et de l'interface ?
V. Gestion des chemins de recherche
VI. Quelles sont les nouveautés sur les MFC ?
VII. Support partiel de C++0x
VIII. La nouvelle bibliothèque sur le parallélisme en mode natif : Parallel pattern Library
IX. Conclusion
X. Remerciements


I. Comment se comporte cette version en termes de rapidité ?

Je n'ai pas constaté de problèmes de lenteur, cette version se comporte normalement.


II. Vraiment finie la galère du fichier .ncb et de la perte de l'IntelliSense ?

Comme vous l'avez peut être appris, cette nouvelle version ne travaille plus avec le fichier .ncb mais utilise une base SQL (locale) pour tenir à jour les informations relatives aux classes (classview) et d'IntelliSense.
En cas de problème nous étions habitués à supprimer le .ncb dorénavant une nouvelle commande "Relancer l'analyse de la solution" apparait dans le menu projet pour scanner la solution.
Le fichier .ncb porte l'extension .sdf et est exploité par SQL Server Compact database.
Un onglet de paramétrage de l'IntelliSense a été rajouté dans les options à l'emplacement : Menu Outils/Options/Editeur de texte/ C/C++ /Avancé.

Une section qui peut être intéressante à modifier est " Emplacement de secours ".
Par défaut l'IDE utilise le répertoire de votre solution pour stocker les fichiers .sdf.
En indiquant un répertoire dans la rubrique " Emplacement de secours " l'IDE utilisera cet emplacement pour créer ces fichiers.
N'oubliez pas de paramétrer votre anti-virus pour exclure ce fichier de l'analyse.
IntelliSense a aussi évolué puisqu'il donne maintenant des informations sur la validité ou la cohérence du code écrit,
Exemples :



Ou encore :


À l'usage cette fonctionnalité est très pratique, d'un simple coup d'œil je sais que mon code ne compilera pas, alors que précédemment il faillait lancer une compilation pour voir les erreurs…


III. Puis-je distribuer mon programme MFC ou C++ avec les DLL systèmes associées ?

La réponse est oui, il est maintenant possible de distribuer son programme dans un répertoire avec les DLL MFC et celle de la CRT.
Il ne sera donc plus nécessaire à priori d'utiliser vcredist.


IV. Quelles sont les nouveautés de l'éditeur et de l'interface ?

La nouvelle interface utilise WPF. Le premier apport important est le zoom vectoriel rendu possible sur un fichier source.
Il suffit d'utiliser la molette de la souris avec la touche CTRL enfoncée pour zoomer sur le texte.
- Gestion des projets récents :

Les projets ouverts peuvent être punaisés comme sur la barre d'outils de Seven.

- Nouvelles possibilités de l'interface MDI :

Le menu contextuel sur l'onglet du document donne de nouvelles fonctionnalités :

Une fonctionnalité qui me manquait depuis longtemps : la commande " flotter " qui permet de détacher la fenêtre des onglets MDI, cela permet de disposer un élément en dehors de l'interface de l'éditeur.
Cette fonctionnalité s'applique bien sûr aux autres éléments de l'interface comme le gestionnaire de projets ou par exemple un fichier source.
Les fenêtres de l'interface se ferment par la croix directement disponible sur l'onglet.
- Personnaliser la page d'accueil de Visual Studio :

Quand j'ai commencé à m'intéresser à ce sujet sur les versions bêta il fallait travailler sur un fichier au format XAML, avec la RC exit le format XAML retour au XML

Les fichiers à modifier sont situés à l'emplacement d'installation de Visual Studio 2010, ce qui donne sur ma machine :
D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\StartPages\en
Il y a un fichier par type d'environnement, dans mon cas j'ai modifié le fichier Links.Ultimate.VC.xml.
Rajouter une nouvelle section est un jeu d'enfant. Je me suis concocté une nouvelle section pour rester connecté avec ma tribu :

j'ai commencé par capturer la page d'accueil de developpez.com que j'ai enregistrée dans un fichier au format .png
J'ai ensuite rajouté la section suivante juste en dessous de celle de " Community and Learning Resources "

    <item>
        <title id="welcome_developpez_title">Communauté developpez.com</title>
        <image>D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\StartPages\en\developpez.PNG</image>
        <description id="welcome_developpez_desc">le club des professionnels de l'informatique</description>
        <commands>
          <command>
            <commandtype>Browse</commandtype>
            <title id="welcome_developpez_cmd1_title">La Faq Visual C++</title>
            <parameter>http://cpp.developpez.com/faq/vc/</parameter>
          </command>
          <command>
            <commandtype>Browse</commandtype>
            <title id="welcome_developpez_cmd2_title">La Faq C++</title>
            <parameter>http://cpp.developpez.com/faq/cpp/</parameter>
          </command>
          <command>
            <commandtype>Browse</commandtype>
            <title id="welcome_developpez_cmd3_title">Forums Visual C++</title>
            <parameter>http://www.developpez.net/forums/f29/c-cpp/outils-c-cpp/visual-cpp/</parameter>
          </command>          
        </commands>
      </item> 
À mon avis la solution retenue en XML est plus simple que la précédente en XAML.

- Cibler une autre plateforme de construction du projet :

Il est possible de spécifier Visual Studio 9.0 pour la construction du binaire de votre application, dans ce contexte, Visual Studio 2010 utilisera Visual Studio 2008 (qui devra être présent sur la machine) pour construire le projet. ce réglage se fait directement dans votre projet à l'emplacement suivant: Propriétés de configuration/Ensemble d'outils de plateforme.


V. Gestion des chemins de recherche

Avant vous définissiez vos différents chemins de recherche pour les sources, bibliothèques etc dans le menu options de Visual Studio.
Et bien c'est fini.
Ce paramétrage a migré dans votre projet !

Vous pouvez exporter le paramétrage des chemins de recherche définis globalement dans Visual studio 2008 pour les réintégrer dans Visual Studio 2010.
Au final dans chaque nouveau projet ou projet migré on retrouve l'ensemble des chemins de recherche dans les différentes sections.
Pour définir globalement vos chemins de recherche, il existe plusieurs solutions :
Pour les définir par l'IDE, il faut appeler à partir d'un projet l'option affichage / Gestionnaire de propriétés.

L'item Microsoft.Cpp.Win32.user.props contient la définition des chemins par défaut.
Il est possible de modifier directement ce fichier au format xml, stocké par utilisateur.
Il est situé à l'emplacement (sous seven) :
C:\Users\user\AppData\Local\Microsoft\MSBuild\v4.0
En voici un exemple vierge de toutes modifications:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ExecutablePath>$(ExecutablePath)</ExecutablePath>
    <IncludePath>;$(IncludePath)</IncludePath>
    <ReferencePath>$(ReferencePath)</ReferencePath>
    <LibraryPath> $(LibraryPath)</LibraryPath>
    <SourcePath>$(SourcePath)</SourcePath>
    <ExcludePath>$(ExcludePath)</ExcludePath>
  </PropertyGroup>
</Project>
Il vous faudra donc rajouter toutes vos définitions globales dans ce fichier en séparant les chemins par des " ; ", ou en passant par l'interface de l'IDE.

Bien qu'on arrive au même fonctionnement qu'avec Visual Studio 2008, la différence tient dans le paramétrage, qui a migré dans un fichier stocké par utilisateur.


VI. Quelles sont les nouveautés sur les MFC ?

- La classe CTaskDialog :

Cette nouvelle classe permet de définir rapidement des boîtes à messages plus évoluées que la classique boîte de dialogue obtenue par la fonction MessageBox.
Ellen ne sera disponible qu'avec Windows Vista, et Seven et est une encapsulation directe de l'api Win32.
La méthode DoModal appelle directement dans COMCTL32.DLL la fonction TaskDialogIndirect.

Un petit exemple ?
J'ai rajouté ces quelques lignes dans mon projet de tests sur un bouton d'une FormView :

void Ctestvc2010View::OnBnClickedButtontaskdlg()
{
// TODO: Add your control notification handler code here	
CTaskDialog dlg(_T("Une CTaskDialog présente des informations d'une manière claire et cohérente"), _T("Que pensez-vous de CTaskDialog?"), _T("Exemple CTaskDialog"), 0,
                     TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS , _T("J'espère que vous l'aimez!"));

       dlg.AddCommandControl( 10, _T("&Utilisez-la!\nC'est la meilleure boîte dialogue que vous pouvez avoir!!"));
       dlg.AddCommandControl( 20, _T("&Peut-être?\nVous ne voulez pas l'essayer ?"));
       dlg.AddCommandControl( 25, _T("&Aucune chance!\nJe ne vais pas l'utiliser!"));

       dlg.AddRadioButton( 3, _T("Beaucoup"));
       dlg.AddRadioButton( 7, _T("Un Petit peu "));
       dlg.AddRadioButton( 4, _T("Pas du tout"));
    
       dlg.SetMainIcon(TD_SHIELD_ICON);
       dlg.SetFooterIcon(TD_INFORMATION_ICON);
       INT_PTR nResult = dlg.DoModal();
	  
}
C'est une traduction directe de l'exemple que l'on peut trouver sur le blog de l'équipe Visual US.
- Redémarrage de l'application après un crash :

Ce système que vous avez peut être déjà expérimenté dans Office 2007 ou Visual Studio permet de relancer l'application avec une restauration de l'environnement de travail, qui est régulièrement sauvegardé par l'application.
La bibliothèque MFC implémente donc maintenant ce mécanisme qui devient une option de l'assistant à la génération du programme.

- DPI Awareness :

Cette option permet d'adapter le texte et les contrôles de nos applications MFC en fonction du réglage des fontes Windows :

La petite fonte correspondant à 96 dpi, la moyenne à 120 dpi et la grande à 144 dpi.
Cette option est activable dans les options du projet à l'emplacement : Outil Manifeste/Prise en charge DPI.
- Gestion des transactions sur les opérations fichier et sur les fonctions associées à la Base de registre:
Une nouvelle classe ATL CAtlTransactionManager permettant de gérer les transactions des fichiers a été rajoutée.
Les différentes classes MFC de manipulation de fichier ou de répertoires ont été modifiées pour supporter cette fonctionnalité.

CFile(CAtlTransactionManager *);
CStdioFile(CAtlTransactionManager *);
CAtlFile(CAtlTransactionManager *);
CFileFind(CAtlTransactionManager *);
Les API : AfxRegCreateKey, AfxRegOpenKey, AfxRegDeleteKey disposent désormais d'un paramètre TransactionManager.

Exemple avec AfxRegCreateKey :

LONG AFXAPI AfxRegCreateKey(HKEY hKey, LPCTSTR lpSubKey, PHKEY phkResult, CAtlTransactionManager* pTM = NULL);
Cet exemple issu du blog US de Visual Studio illustre l'utilisation de la transaction (commit) et du retour arrière (rollback) :

 CAtlTransactionManager tmCommit;
 CFile cfile1(_T("c:\\TransactionFileSystemDemo\\cfile1.txt"), CFile::modeCreate, &tmCommit);

 CStdioFile stdiofile1(_T("c:\\TransactionFileSystemDemo\\cstdiofile1.txt"), CFile::modeCreate, &tmCommit);

 CAtlFile atlfile1(&tmCommit);
 atlfile1.Create(_T("c:\\TransactionFileSystemDemo\\atlfile1.txt"), STANDARD_RIGHTS_REQUIRED, FILE_SHARE_READ, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL);

 tmCommit.Commit();
 tmCommit.Close(); 

CAtlTransactionManager tmRollback;
CFile cfile2(_T("c:\\TransactionFileSystemDemo\\cfile2.txt"), CFile::modeCreate, &tmRollback);
 CStdioFile stdiofile2(_T("c:\\TransactionFileSystemDemo\\cstdiofile2.txt"), CFile::modeCreate, &tmRollback);
 CAtlFile atlfile2(&tmRollback);

 atlfile2.Create(_T("c:\\TransactionFileSystemDemo\\atlfile2.txt"), STANDARD_RIGHTS_REQUIRED, FILE_SHARE_READ, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL);

 tmRollback.Rollback();
tmRollback.Close();
- Le support du multi-touch :

Les applications MFC peuvent prendre en compte le multi-touch de Windows Seven.
Voici rapidement comment procéder :
Dans la méthode InitInstance de votre classe d'application rajouter les lignes suivantes pour tester le support matériel du multi-touch :

BYTE digitizerStatus = (BYTE) GetSystemMetrics(SM_DIGITIZER);
if ((digitizerStatus & (0x80 + 0x40)) == 0) //Stack Ready + MultiTouch
{
 AfxMessageBox(L"Pas de périphérique Multi-Touch disponible");
	 return FALSE;
}	 
BYTE nInputs = (BYTE) GetSystemMetrics(SM_MAXIMUMTOUCHES);	 
CString str;
str.Format(L"Périphérique Multi-Touch disponibl avec  %d points.", nInputs);
//AfxMessageBox(str);
Pour indiquer que votre application cliente est apte a recevoir les messages Multi-Touch, il faudra appeler la méthode CWnd::RegisterTouchWindow() dans la méthode de réponse au message WM_CREATE de votre fenêtre fille (la child ) de traitement.

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1)
		return -1;
	if (!RegisterTouchWindow()) return -1;
}
L'appel de cette méthode rend l'application capable de recevoir les messages WM_TOUCH.
Il vous faut ensuite rajouter manuellement dans la child la méthode suivante :

virtual BOOL OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput);
Cette méthode va nous permettre de traiter les différents événements possibles :

BOOL CChildView::OnTouchInput(CPoint pt, int nInputNumber, int nInputsCount, PTOUCHINPUT pInput)
{    
   if ((pInput->dwFlags & TOUCHEVENTF_DOWN) == TOUCHEVENTF_DOWN) // Touch Down event
   {
        // votre traitement
	return TRUE;
   }
   else if ((pInput->dwFlags & TOUCHEVENTF_MOVE) == TOUCHEVENTF_MOVE) // Touch Move event
   {
        // votre traitement
	return TRUE;
   }
   else if ((pInput->dwFlags & TOUCHEVENTF_UP) == TOUCHEVENTF_UP) // Touch Move event
   {
        // votre traitement
	return TRUE;
   }
	 
   return FALSE;
}
Voilà pour la mise en place de l'architecture.
Il ne reste plus qu'à mettre en place votre traitement.

- Le retour de Class Wizard :

Cet outil, présent dans Visual 6.0 a été enlevé avec Visual Studio 2002.
Il fait son grand retour dans Visual Studio 2010.
Il faut dire que cela fait des années que tout le monde le réclame.

Le raccourci clavier n'est pas le même que sous Visual 6.0 CTRL+X mais CTRL+MAJ+X
On retrouve enfin les mêmes fonctionnalités dont nous disposions sous Visual 6.0.

Pour ceux qui n'ont pas connu Class Wizard c'est une boite à onglets permettant de réaliser l'ensemble des opérations possibles sur une classe fenêtre : messages, ajout de données membres, etc.
Plutôt que de courir à différents endroits pour effectuer des opérations, tout est disponible dans un seul outil.
D'autre part, différentes actions peuvent être réalisées en même temps, comme l'ajout de plusieurs variables associées à des contrôles, ce qui n'était pas (plus) le cas avant.

- Image de fond dans les dialogues :
Il est maintenant possible de rajouter une image en fond d'une boîte de dialogue avec la " mockup bar " , celle-ci est disponible en bas de l'éditeur de ressources.
Un clic sur le bouton de parcours de fichier dans la barre permet de sélectionner une image que l'on pourra positionner grâce aux zones d'offset dont on pourra régler l'opacité.
Malgré cela je ne peux que regretter l'absence d'un dispositif permettant de régler la couleur de fond d'une boîte de dialogue ou d'une FormView.

- Autorisation d'affichage des ActiveX dans l'éditeur de ressources :
Si des ActiveX sont présents dans vos ressources, Visual Studio vous demandera l'autorisation de les afficher, ce qui risque à la longue de devenir fatiguant.

Certains d'entre vous ont du remarquer depuis Visual Studio 2008 l'absence de l'application qui permettait de tester un Activex, celle-ci est en fait disponible dans les exemples des MFC situés à l'emplacement suivant :
Pour VS2008 : [Program Files]\Microsoft Visual Studio 9.0\Samples\1033\AllVCLanguageSamples.zip
Pour VS2010: [Program Files]\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples.zip
L'exemple se nomme TSTCON dans le dossier OLE.

- Prévisualisation des documents dans la barre de Windows Seven :

J'ai généré une application multi-document MFC avec une CEditView.
Lorsque j'ouvre trois onglets dans mon application MFC ils deviennent visibles dans la barre d'application de Windows Seven.
De plus, le clic sur le document dans la barre des taches active l'onglet correspondant dans l'application.
Au moment de la génération de l'application, j'ai coché les options de prévisualisation du document et de l'affichage simplifié.

Ces options permettent la prévisualisation du document dans l'explorateur Windows, son affichage simplifié (Thumbnail) et la recherche de contenu.
Toute la logique de traitement est générée automatiquement dans la classe document.
Il faudra adapter ce code pour vos documents.

- Programmation du Ruban (ribbon) :

Le ruban est maintenant directement éditable dans l'éditeur de ressource.
Sa description est au format XML.
Sa composition est donc moins laborieuse que dans Visual Studio 2008 ou il fallait tout coder manuellement.

L'ensemble des contrôles nécessaires à la création du ruban est donc disponible dans la Boîte à outils.
Une remarque personnelle : le ruban est beau mais il ne se prête pas à toutes les applications.
Les écrans d'aujourd'hui sont pratiquement tous au format large (wide) et la perte de surface en hauteur provoquée par ce style d'interface est très pénalisante.
Il serait intéressant (c'est un appel du pied) de disposer de la même interface à la verticale de l'écran…


VII. Support partiel de C++0x

Le tableau ci-dessus expose les avancées du support de C++0x pour Visual Studio 2010 par rapport à Visual Studio 2008 :

C++0x : fonctionnalités de langage Proposition VC9 VC10
Références Rvalue N2118 NON V2
Références Rvalue v2 N2844 NON V2
Références Rvalue pour this N2439 NON NON
Initialisation de classe d'objets par rvalues N1610 OUI OUI
static_assert N1720 NON OUI
auto N1984 NON OUI
Déclarations multiples avec auto N1737 NON OUI
Suppression de l'ancienne fonctionnalité auto N2546 NON OUI
Mise en place du type de retour N2541 NON OUI
Lambdas N2927 NON V1.0
decltype N2343 NON OUI
Crochets en chevron à droite (>>) N1757 OUI OUI
Modèle (template) Externe N1987 OUI OUI
nullptr N2431 NON OUI
enums Fortement typés N2347 Partiel Partiel
Pré- déclaration des enums N2764 Partiel Partiel
Déclarations amies (friend) étendues N1791 Partiel Partiel
Type local et non nommé en tant qu'arguments de modèles N2657 OUI OUI
Fonctionnalités de langage de base: Concurrence      
exception_ptr N2179 NON OUI
Stockage de données local au thread (TLS) pour info cette technique est utilisée dans les MFC. N2659 Partiel Partiel
Fonctionnalités de langage de base: C99      
__func__ N2340 Partiel Partiel
Préprocesseur C99 N1653 Partiel Partiel
long long N1811 OUI OUI


VIII. La nouvelle bibliothèque sur le parallélisme en mode natif : Parallel pattern Library

Cette bibliothèque permet de paralléliser des applications natives en C++.
Elle rentre en concurrence avec celle d'Intel : TBB (fr voir mon compte rendu des Techdays 2008)

La bonne nouvelle c'est qu'Intel utilisera pour la partie Windows, le moteur d'exécution de Microsoft : le Concurrency Runtime.
Cette bibliothèque adopte le style standard de la Template Librairie (STL) tout en tirant parti des nouvelles caractéristiques du standard C++0x avec notamment les expressions lambda.
Voici un aperçu express des différentes fonctionnalités :
On peut distinguer quatre parties :

a) Le parallélisme de tache
o task_handle
o task_group

b) Les primitives de synchronisation
o reader_writer
o enter_critical
o Event

c) Les algorithmes
o parallel_for
o parallel_for_each
o parallel_invoke
o parallel_accumulate

d) Les containeurs avec gestion de la concurrence
o concurrent_queue
o concurrent_vector
o concurrent_unordered_map
o combinable

Il est à noter que le débogueur de Visual Studio a été remanié pour tenir compte du parallélisme avec une vision par thread par tâche etc.

Voilà pour l'essentiel.
je vous invite à consulter MSDN pour plus d'informations.


IX. Conclusion

Beaucoup de nouveautés et de points positifs pour ce produit d'ores et déjà disponible.
Nouvelles fonctionnalités, confort d'utilisation de l'IDE amélioré, Visual Studio 2010 est en nette évolution par rapport à Visual Studio 2008.

Ce sera tout pour ce tour d'horizon rapide des nouveautés apportées à l'interface de la version 2010 de Visual Studio et à son module C++.


X. Remerciements

Je remercie toute l'équipe C++, pour leur relecture attentive du document ainsi que azertix pour la correction finale de cet article.



               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2010 Farscape. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.

Contacter le responsable de la rubrique C++