Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS C FAQs C TUTORIELS C LIVRES C COMPILATEURS C SOURCES GTK+

Tutorial d'initiation
A la programmation avec l'API Windows

Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
PrécédentIndexSuivant

Chapitre 1

Les bases d'un programme Windows

3. Affichage dans une fenêtre

Cours théorique :

Maintenant que nous savons créer une fenêtre, nous allons voir comment dessiner dans sa zone client. L'affichage dans la zone client d'une fenêtre se fait au niveau du message WM_PAINT. Pour provoquer l'envoi d'un tel message, il faut demander le redessinement d'une zone de la fenêtre. Lors du dessin dans la partie WM_PAINT, il sera impossible d'afficher hors de la zone de redessinement.

Pour dessiner dans une fenêtre, nous allons utiliser un contexte d'affichage. Il est propre à la fenêtre dans laquelle nous dessinons et nous est fourni par Windows. Il identifie en fait la zone de l'écran dans laquelle nous allons dessiner.

Projet N°3 :

- Objectif : créer une fenêtre et afficher l'heure.

- Réalisation : la création de la fenêtre se fera de manière identique au projet précédent. Seule sera ajoutée la partie permettant l'affichage de l'heure courante.

Télécharger le projet ici.

- Le projet pas à pas :

La création de la fenêtre se fait exactement de la même manière que dans le projet précédent. Nous allons simplement utiliser les fonctions contenues dans stdio.h.

#include <Windows.h>
#include <stdio.h>


LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   WNDCLASSEX principale;
   principale.cbSize=sizeof(WNDCLASSEX);
   principale.style=CS_HREDRAW|CS_VREDRAW;
   principale.lpfnWndProc=MainProc;
   principale.cbClsExtra=0;
   principale.cbWndExtra=0;
   principale.hInstance=hInstance;
   principale.hIcon=LoadIcon(NULL,IDI_APPLICATION);
   principale.hCursor=LoadCursor(NULL,IDC_ARROW);
   principale.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
   principale.lpszMenuName=NULL;
   principale.lpszClassName="std";
   principale.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
   RegisterClassEx(&principale);

   HWND hWnd;
   hWnd=CreateWindowEx(
      WS_EX_CLIENTEDGE,
      "std",
      "Notre fenêtre",
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      CW_USEDEFAULT,
      NULL,
      NULL,
      hInstance,
      NULL
   );
   ShowWindow(hWnd,SW_SHOW);

Comme nous allons afficher l'heure, il est important que nous soyons prévenus de manière régulière. Nous allons demander à Windows de nous avertir toutes les secondes, de manière à afficher l'heure régulièrement. Notre fenêtre recevra un message WM_TIMER toutes les secondes.

   SetTimer(hWnd,NULL,1000,NULL);

La réception des messages se fait exactement de la même manière que dans le projet précédent.

   MSG msg;
   while(GetMessage(&msg,NULL,0,0)==TRUE)
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return 0;
}

La procédure fonctionne de manière identique que précédemment. Nous allons ajouter le traitement du message WM_TIMER qui sera recu toutes les secondes. Ce message demandera le redessinement d'une zone de l'écran (la zone ou nous afficherons l'heure).

LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
   HDC hDC;
   PAINTSTRUCT paintst;
   RECT rcClient;
   switch (mes)
   {
      case WM_TIMER:
         rcClient.top=0;
         rcClient.left=0;
         rcClient.right=100;
         rcClient.bottom=50;
         RedrawWindow(hWnd,&rcClient,NULL,RDW_ERASE|RDW_INVALIDATE|RDW_ERASE 
NOW|RDW_NOCHILDREN);
         return 0;

Un message WM_PAINT sera donc reçu toutes les secondes et à chaque fois que la fenêtre doit être redessinée. La fenêtre doit être redessinée si elle est couverte puis découverte par une autre fenêtre (par exemple).

Nous allons afficher l'heure en utilisant une police spécifique. Une fois cette police créée, il est nécessaire d'indiquer que nous allons l'utiliser dans notre contexte d'affichage (HDC). Le contexte d'affichage (ou Device Context) réfère à la zone client de notre fenêtre et contient tous ses paramètres graphiques (disposition sur l'écran, nombre de couleurs affichables...). Il est identifié par la variable hDC qui nous est passée par Windows au travers de la fonction BeginPaint().

Une fois la police créée et le texte dessiné, il convient de détruire la police.

L'heure courante sera récupérée grace à la fonction GetLocalTime().

   case WM_PAINT:
      char buf[256];
      SYSTEMTIME CurrentTime;
      HFONT hFont;
      hFont=CreateFont(20,0,0,0,700,FALSE,FALSE,FALSE,0,OUT_DEFAULT_PRECIS,CLIP_ 
DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Comic Sans MS");
      hDC=BeginPaint(hWnd,&paintst);
      SelectObject(hDC,hFont);
      GetLocalTime(&CurrentTime);
      sprintf(buf,"%d : %d : %d",CurrentTime.wHour,CurrentTime.wMinute,CurrentTi 
me.wSecond);
      TextOut(hDC,0,0,buf,strlen(buf));
      EndPaint(hWnd,&paintst);
      DeleteObject(hFont);
      return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   default:
      return DefWindowProc(hWnd, mes, wParam, lParam);
   }
}

Il est essentiel de bien comprendre le principe d'affichage dans une fenêtre car il est très utilisé par Windows. Quelque soit le cas, l'affichage se fait toujours entre deux fonctions qui indiquent le début et la fin de l'affichage. Il ne faut jamais oublier de libérer le contexte d'affichage après l'avoir utilisé. Ici, la libération du contexte d'affichage se fait par la fonction EndPaint().


PrécédentIndexSuivant

Responsable bénévole de la rubrique C : Arnaud Feltz (buchs) - Contacter par EMail :
Vos questions techniques : forum d'entraide C - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.