Fonction CreateWindow

#include <windows.h>

#define LONG_FENETRE 300
#define LARG_FENETRE 300

LRESULT CALLBACK MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    return DefWindowProc( hWnd, msg, wParam, lParam );
}

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    // Enregistre la classe de la fenêtre
    WNDCLASSEX wc = {
        sizeof(WNDCLASSEX),
        CS_CLASSDC, MsgProc,
        0L, 0L,
        GetModuleHandle(NULL),
        NULL, NULL, NULL, NULL,
        "SuperBattle", NULL };

    RegisterClassEx( &wc );


    // Création de la fenêtre d'application
    HWND hWnd = CreateWindow(
    "Superbattle", "Superbattle",
    WS_OVERLAPPEDWINDOW,
    100, 100, LONG_FENETRE, LARG_FENETRE * 2,
    GetDesktopWindow(),
    NULL, wc.hInstance, NULL );

    ShowWindow(hWnd, SW_SHOWDEFAULT);
    UpdateWindow(hWnd);

    MSG msg;
    ZeroMemory( &msg, sizeof(msg) );

    while( msg.message!=WM_QUIT )
        if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
    
    }
   UnregisterClass("Superbattle", wc.hInstance);
    return 0;
}

La fonction CreateWindow permet de créer la fenêtre proprement dite. Elle retourne un pointeur de type HWND.

paramètre 1 et 2 : Le nom de l'exécutable
paramètre 3 : style de la fenêtre on a soit

WS_VISIBLE; soit WS_OVERLAPPEDWINDOW

WS_OVERLAPPEDWINDOW permet de s'afficher par dessus les autres fenêtres existantes

paramètre 4 : position de la fenêtre sur l'axe des x
paramètre 5 : position de la fenêtre sur l'axe des y
paramètre 6 : largeur
paramètre 7 : hauteur
paramètre 8 : pointeur de la fenêtre parent. Ici il s'agit du bureau, appelé (desktop)
paramètre 9 : pointeur de la fenêtre fille ou du menu
paramètre 10 : instance de la structure WNDCLASSEX.
paramètre 11 : utilisé pour les créations de documents multiples

ShowWindow : Affiche la fenêtre à l'écran.
UpdateWindow : Rafraîchit la fenêtre.
Ensuite nous avons une boucle infinie qui ne sort que si l'on appuie sur la touche Échappe. Au coeur de la boucle l'interception des événements est interprété par PeekMessage. Ceci sera remplacé à terme par l'intercepteur DirectInput qui est plus adapté aux jeux et qui est plus performant.
La fenêtre doit faire une taille de 300 par 600 pixels. Elle recevra 2 autres fenêtres filles de 300 par 300 pixels pour les deux joueurs.

Pour PeekMessage 

Paramètre 1 : adresse de la structure du message
Paramètre 2 : pointeur de la fenêtre qui analyse le message
Paramètre 3 : valeur du premier message
Paramètre 4 : valeur du deuxième message
Paramètre 5 : styles de messages :

PM_NOREMOVE : les messages ne sont pas effacés de la pile
PM_REMOVE : les messages sont effacés de la pile

TranslateMessage : envoi une le code de la touche clavier.
DispatchMessage : envoi le message à une procédure windows

Téléchargez la source, cliquez ci-dessous :