Mandragor


Le programme

Code source

Le programme super_original.c:

//
//  Un premier exemple de programme Windows
//  Ce programme va afficher du texte au centre
//  d'une fenêtre.
//

#include <windows.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);


// Voilà la fonction principale

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  HWND hwnd;
  MSG msg;
  WNDCLASSEX wndclassex;
  char szClassName[ ] = "MyLittleWindow";

  wndclassex.cbSize = sizeof(WNDCLASSEX);
  wndclassex.style = CS_HREDRAW | CS_VREDRAW;
  wndclassex.lpfnWndProc = WindowProcedure;
  wndclassex.cbClsExtra = 0;
  wndclassex.cbWndExtra = 0;
  wndclassex.hInstance = hInstance;
  wndclassex.lpszClassName = szClassName;
  wndclassex.hIcon = NULL;
  wndclassex.hIconSm = NULL;
  wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW);
  wndclassex.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  wndclassex.lpszMenuName = NULL;

  if(!RegisterClassEx(&wndclassex))
  {
    MessageBox(NULL, "Erreur lors de l'enregistrement de la classe fenêtre principale", "Erreur", MB_OK);
    return 1;
  }

  // Création de la fenêtre principale
  hwnd = CreateWindowEx(
         0,      // Style de fenêtre étendu, inutilisé ici
         szClassName, // Nom de la classe à utiliser
         "Programme super_original.c",  // Chaine de caractère qui sera placée
                                        // dans la barre de titre de la fenêtre
         WS_OVERLAPPEDWINDOW,
         CW_USEDEFAULT, // Position en X de la fenetre, utiliser la valeur par défaut
         CW_USEDEFAULT, // Position en Y de la fenetre, utiliser la valeur par défaut
         CW_USEDEFAULT, // Largeur de la fenêtre, utiliser la valeur par défaut
         CW_USEDEFAULT, // Hauteur de la fenêtre, utiliser la valeur par défaut
         NULL,  // Handle de la fenêtre parent; il s'agit de la fenetre mère, on met NULL
         NULL,  // Handle de menu, on n'en veut pas, on met NULL
         hInstance, // Instance de l'application
         NULL // Non nécessaire pour le moment
         );

  ShowWindow(hwnd, SW_SHOW);
  UpdateWindow(hwnd);

  // Voila notre boucle de messages
  while(GetMessage(&msg, NULL, 0, 0))
  {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
  }

  return msg.wParam;
}


//  Et voila notre fonction de rappel ou 
//  fonction CALLBACK

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  RECT rect;

  switch (message)
  {
    case WM_PAINT:
      hdc = BeginPaint(hwnd, &ps);
      GetClientRect(hwnd, &rect);
      DrawText(hdc, "Un programme super original", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
      EndPaint(hwnd, &ps);
      break;

    case WM_DESTROY:
      PostQuitMessage(0);
      break;

    default:
      return DefWindowProc(hwnd, message, wParam, lParam);
  }

  return 0;
}

Voici un screenshot de ce que va donner le code ci-dessus sous Windows XP:

screen1