Messages, threads et fenêtres et sous Win32 by ntz11397

VIEWS: 11 PAGES: 10

									                 Messages, threads et fenêtres et sous Win32.


Il existe plusieurs types de message sur Win32. Nous verrons les messages entre
fenêtres. Ceci nous servira à implémenter une application avec interface
utilisateur.


                             Windows = fenêtres !




                                                                                  1
Concepts de base de l’interface utilisateur Win32

 Le concept de fenêtre joue un rôle central dans le concept d’interface graphique
 de Windows...


 Dans Windows, le type HWND (handle sur une fenêtre) désigne les fenêtres.

 Dans Windows, un grand nombre d’éléments de l’interface sont du type HWND:
 boutons, listes d’items, barres d’outils, etc.

 Le système d’exploitation envoie des messages aux fenêtres en réponse aux
 action de l’utilisateur de d’autres évènements. Par exemple, si un utilisateur
 clique dans une fenêtre, celle-ci recevra un message approprié.

 Une fenêtre est une instance d’une classe de fenêtres. Une classe de fenêtre est
 définie par une WinProc.
 Attention: il ne faut pas confondre classe de fenêtres Windows et classe au sens
 de programmation orientée objet. Dans Windows, un classe de fenêtre
 correspond plutôt à un « patron » ou encore un modèle de fenêtre.
 La WinProc est une fonction de type « callback » dont le rôle est de déterminer
 l’action que prend une instance de fenêtre en réponse à un message du SE.          2
Le point d’entrée dans une application Win32 est la fonction WinMain.


int APIENTRY WinMain(HINSTANCE   hInstance,
                     HINSTANCE   hPrevInstance, // Toujours 0 sous Win32
                     LPSTR       lpCmdLine,     // Line de commande
                     int         nCmdShow);     // État initial.



La forme générale de cette fonction est la suivante:
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   MSG msg;

    Initialisations();
    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
       DispatchMessage(&msg);
    }
    return msg.wParam;
}


                                                                           3
La structure des messages sous Win32:



struct MSG {
    HWND       hwnd;      //   Fenêtre qui reçoit le message
    UINT       message;   //   ID du message
    WPARAM     wParam;    //   paramètre (dépend de message).
    LPARAM     lParam;    //   paramètre (dépend de message).
    DWORD      time;
    POINT      pt;        // point où se situait le pointeur de la   souris.
};




                                                                         4
La fonction pour envoyer un message est PostMessage.

Cette fonction est conçue pour envoyer un message à une fenêtre. Le SE mettra
le message envoyé dans la file du thread ayant crée la fenêtre.

Il y a aussi une fonction PostThreadMessage qui envoie le message directement à
un thread.

PostMessage(hwnd, msg, wparam, lparam);

PostThreadMessage(thread_id, msg, wparam, lparam);


                                                                                5
     Processus   File de messages
                 M0, M1, M2, …




F0, F1, F2, …

Fenêtres




                                    6
Classes de fenêtres

La structure WINCLASSEX sert à définir une classe de fenêtres.

Struct WNDCLASSEXW {
    UINT        cbSize;   // Taille de la struc
    /* Win 3.x */
    UINT        style;    // Style des fenêtres (redessinage, double-clics,
    etc.)
    WNDPROC     lpfnWndProc; // WinProc
    int         cbClsExtra; // Info extra pour la classe
    int         cbWndExtra; // Info extra pour chaque instance de fenêtre
    HINSTANCE   hInstance;    // Identifie l’application
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName; // Nom de la classe
    /* Win 4.0 */
    HICON       hIconSm;
};


                                                                         7
Il faut enregistrer la classe avant de l’utiliser.


             WNDCLASSEX wcex;

             wcex.cbSize =     sizeof(WNDCLASSEX);
             wcex.style        = CS_HREDRAW | CS_VREDRAW;
             wcex.lpfnWndProc = (WNDPROC)WndProc;
             wcex.cbClsExtra = 0;
             wcex.cbWndExtra = 0;
             wcex.hInstance    = hInstance;
             wcex.hCursor      = LoadCursor(NULL, IDC_ARROW);
             wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);
             wcex.lpszMenuName = (LPCSTR)IDC_WIN_THREAD;
             wcex.lpszClassName= szWindowClass; // Nom de la classe
             wcex.hIconSm      = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

             RegisterClassEx(&wcex);



   hwnd = CreateWindow(szWindowClass,            // Nom de la classe
                      szTitle,
                      WS_OVERLAPPEDWINDOW, // Avec titre et bordure
                      x, y,
                      largeur, hauteur,
                      NULL, NULL, hInstance, NULL);

                                                                          8
Forme typique d’une WindProc

LRESULT CALLBACK WndProc( HWND hWnd,         // Fenêtre qui reçoit le message
                            UINT message,    // Message
                            WPARAM wParam,   // Paramètres du message
                            LPARAM lParam)   // Idem.
{
         // Traitement.
         switch (message)
         {
                 case … : … ;
                 case … : … ;
                 default: DefWinProc(message);
         }
    return 0;
}




                                                                          9
Quelques messages



         WM_COMMAND       Menu
         WM_CREATE        Création de la fenêtre
         WM_PAINT         Demande pour redessiner
                          d’une partie de la fenêtre
         WM_DESTROY       On quitte
         WM_LBUTTONDOWN   Souris
         WM_LBUTTONUP


         WM_MOUSEMOVE     Souris

         Etc.




                                                       10

								
To top