Les environnements de C++
L’environnement Windows
1. Les programmes Win32
La plate-forme Win32 a très vite été supportée par C++ car Microsoft a lancé dès 1992 l’un des premiers environnements intégrés pour ce langage ; il s’agissait de Visual C++, et à cette époque, de nombreux architectes étaient convaincus de l’intérêt d’un langage objet proche du langage C pour créer des applications fonctionnant dans des environnements graphiques.
Toutefois, la programmation d’une application fenêtrée, sans framework, n’est pas une tâche aisée. Il n’en demeure pas moins que la plate-forme Win32 propose plusieurs formats d’applications : applications « console », services Windows, bibliothèques dynamiques (DLL) et bien entendu les applications graphiques fenêtrées.
Il n’existe pas de modèle de projet « Win64 » car Windows reste un système très ancré dans le mode 32 bits. Toutefois, Visual Studio sait compiler en mode 64 bits depuis un projet Win32.
a. Choix du mode de compilation
La création d’un projet s’effectue avec la commande Fichier - Nouveau Projet :
![images/05RI01.png](https://www.eni-training.com/download/c73a35ed-b3ca-4eb5-b278-9a245041bea1/images/05RI01.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Depuis le Gestionnaire de configurations, le mode de compilation 64 bits est activé :
![images/05RI02.png](https://www.eni-training.com/download/c73a35ed-b3ca-4eb5-b278-9a245041bea1/images/05RI02.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Le programme qui suit est intéressant ; il indique que la taille des types int et long est identique à un mode 32 bits.
printf("Programme compilé en mode 64 bits\n");
printf("taille int %d\n", sizeof(int));
printf("taille long %d\n", sizeof(long));
![images/05RI03.png](https://www.eni-training.com/download/c73a35ed-b3ca-4eb5-b278-9a245041bea1/images/05RI03.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Le mode 64 bits recommande au compilateur de produire des instructions microprocesseur 64 bits, mais cela ne veut pas dire que les types sont ajustés en conséquence. Autrement dit, un calcul sur un type __int64 pourra prendre plus de temps en 32 bits qu’en 64, mais __int64 reste toujours 64 bits et int reste sur 4 octets, quel que soit le mode de compilation. Il s’agit là d’une particularité du compilateur de Microsoft ; d’autres compilateurs peuvent adopter un comportement différent.
b. Fonctionnement des applications fenêtrées Win32
Il n’y a pas de différence structurelle entre l’exécutable console et le desktop....
Applications
1. Réaliser une application de dessin Win32
Nous reprenons le format d’application Win32, étudié à la section L’environnement Windows - Les programmes Win32 de ce chapitre, pour réaliser un programme capable d’afficher deux types de dessins générés par calcul C++.
Notre projet s’appelle C++ WinUI.
La première étape consiste à ajouter de nouvelles entrées Affichage - Surface et Affichage - Fractale au menu de l’application. Pour cela, il faut ouvrir le fichier de ressource et éditer le menu IDC_CWINUI :
![images/05NEWRI09.png](https://www.eni-training.com/download/c73a35ed-b3ca-4eb5-b278-9a245041bea1/images/05NEWRI09.png?id=AAEAAAD%2f%2f%2f%2f%2fAQAAAAAAAAAMAgAAAE1FbmkuRWRpdGlvbnMuTWVkaWFwbHVzLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJ0VuaS5FZGl0aW9ucy5NZWRpYXBsdXMuQ29tbW9uLldhdGVybWFyawIAAAAHcGlzVGV4dAlwaWR0ZURhdGUBAA0CAAAABgMAAAAwdGVzdCB2Ml84IC0gZmZhNjQzOWQtZDZjYi00NzYxLWJhYTMtZWZkZDNiZDcwMWM25rSq0F7p2IgL)
Le caractère souligné dans le libellé des menus sert de raccourci-clavier (on dit aussi accélérateur). Il s’obtient en précédant la lettre A, pour le menu Affichage (puis respectivement S et F), par un signe &.
Pour désigner chaque type de dessin, on définit une énumération dans le fichier C++ WinUI.cpp :
enum Affichage { Surface, Fractale } affichage;
La fonction wWinMain() se substitue à la traditionnelle fonction main(). C’est un emplacement possible pour initialiser la variable affichage :
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Placez le code ici.
affichage = Affichage::Surface;
La fonction WndProc() traite les messages de l’application. À chaque entrée dans le menu correspond une action de WM_COMMAND :
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Analyse...