Création d’une fenêtre sous Windows

0 Flares Twitter 0 Facebook 0 Google+ 0 Email -- Filament.io 0 Flares ×

Les déclarations :

// indispensable
#include 

// contient l'hwnd de la fenêtre
HWND hWnd;

// l'instance
HINSTANCE hInstance_sz;

// la fonction de retour, celle qui va recevoir les messages en provenance du système (ouverture, fermeture,...)
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

La fonction de retour WndProc :

// Cette fonction est appelée par Windows (c'est via celle-ci que tous les messages sont envoyés à la fenêtre)
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM    lParam)
{
    switch (uMsg)
    {
        case WM_SYSCOMMAND:
        {
            switch (wParam)
            {
                case SC_SCREENSAVE:
                case SC_MONITORPOWER:
                return 0;
            }
            break;
        }

        case WM_CLOSE:
        {
            PostQuitMessage(0);
            break;
        }
    }

    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

La fonction DefWindowProc fournit un traîtement par défaut pour tous les messages que le programme ne traîte pas. Elle certifie que tous les messages sont traîtés.
Pour plus de renseignements sur cette fonction : DefWindowProc sur Microsoft.com

La fonction de “nettoyage”. Elle nous permet de centraliser toutes les tâches à effectuer avant que le programme ne se termine (vider la mémoire, etc…) :

// fermeture du programme (on vide la mémoire + autres opérations en fonction de vos besoins)
void Shutdown()
{
    // rien pour le moment
}

Et enfin la fonction la plus importante : WinMain
C’est la fonctione exécutée lors du lancement du programme :

// WinMain : fonction exécutée lors du lancement du programme
int WINAPI WinMain(HINSTANCE hInstance,    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // contient les message reçus lors du démarrage
    MSG    msg;

    // on crée la fenêtre
    WNDCLASSEX wc;

    hInstance_sz = hInstance;

    // instance
    wc.hInstance = hInstance_sz;

    // le nom de la classe
    wc.lpszClassName = "Nom du programme";

    // adresse de la fonction qui va recevoir les messages
    wc.lpfnWndProc = WndProc;

    // style (?)
    wc.style = CS_DBLCLKS;

    // la taille
    wc.cbSize = sizeof(WNDCLASSEX);

    // la grande icône
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    // la petite
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    // le curseur
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);

    // le menu
    wc.lpszMenuName = NULL;

    // ?
    wc.cbClsExtra = 0;

    // ?
    wc.cbWndExtra = 0;

    // la couleur de fond de la fenêtre
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(GetSysColor(COLOR_MENU));

    // on enregistre la classe (celle contenant toutes les infos pour créer notre fenêtre)
    if (!RegisterClassEx(&wc))
        return 0;    // si échoue, on quitte ici

    // et on crée notre fenêtre
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "Titre de la fenêtre", "Server Ox: echecs en ligne", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, HWND_DESKTOP, NULL, hInstance_sz, NULL);

    // on la montre
    ShowWindow(hWnd,SW_SHOW);

    // ok, on lance la boucle
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    //la boucle est terminée, on ferme tout
    Shutdown();

    return (msg.wParam);
}
0 Flares Twitter 0 Facebook 0 Google+ 0 Email -- Filament.io 0 Flares ×

Leave a Comment

*