Application basée boite de dialogue sans ressources

Description

Ce source montre comment créer une application basée sur une boite de dialogue directement par programmation sans passer par les ressources. D'habitude, on ajoute la boite de dialogue en incluant une ressource de type Dialog. Ce n'est pas toujours pratique . Grace à l'astuce utilisé dans ce code on peut par exemple définir la taille de la boite de dialogue pendant l'exécution de l'application. Ce source est conçu sous Visual C++ 6. Créer un nouveau projet WIN32 Application puis copier-coller ce code.

Source / Exemple :


//----------------------------------------------------------------------------------------------------------------------------------------------------
#include <Windows.h>

#define Bouton1 500 // identificateur pour bouton 1
#define Bouton2 501 // identificateur pour bouton 2
#define Quitter 502 // identificateur pour bouton quitter

HINSTANCE hInstance;
HWND hstatic;

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

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    HGLOBAL hmem; //handle mémoire globale
    LPDLGTEMPLATE lpdt; //pointeur sur structure dialog template
    LPWORD lpw; // pointeur sur un WORD
    LPWSTR lpnom; // pointeur sur chaine UNICODE pour le nom de la boite
    
    //allouer de la mémoire  pour notre dialog template
    hmem = GlobalAlloc(GPTR, 512); //GPTR=taille fixe initialisée à 0
    if (!hmem) return 1;

    //convertir le handle en pointeur DLGTEMPLATE sur le début de la mémoire allouée  
    lpdt = ( LPDLGTEMPLATE) hmem;

    // Définir les propriétés de la boite de dialogue
    lpdt->style = WS_POPUP | WS_BORDER |WS_MINIMIZEBOX| WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
    lpdt->x = 10;   //position x
    lpdt->y = 10;   //position y
    lpdt->cx = 300; //largeur
    lpdt->cy = 200; //hauteur

    //obtenir pointeur juste après la structure DLGTEMPLATE
    lpw = (LPWORD) (lpdt + 1);
    
    //obtenir pointeur sur la zone du nom de la boite de dialogue
    lpnom = (LPWSTR) lpw+2;

    //convertir le nom en UNICODE et le mettre dans la zone nom
    MultiByteToWideChar (CP_ACP, 0, "Ma Boîte de Dialogue", -1, lpnom, 128);
    
    // lancer la boite de dialogue
    DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)DialogProc);

    // libération de la mémoire allouée
    GlobalFree(hmem);

     return 0;
}

LRESULT CALLBACK DialogProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
     HWND hbouton1,hbouton2,hcadre,hquitter;
     switch(message)
     {
    
     case WM_INITDIALOG:
         {
             // Creer les boutons, le cadre et la zone de texte
             hbouton1 = CreateWindow("BUTTON", "Bouton 1", WS_CHILD | WS_VISIBLE , 180, 190,80, 30, Dlg, (HMENU)Bouton1, hInstance, 0);
             hbouton2 = CreateWindow("BUTTON", "Bouton 2", WS_CHILD | WS_VISIBLE , 330, 190,80, 30, Dlg, (HMENU)Bouton2, hInstance, 0);
             hstatic    = CreateWindow("STATIC", 0, WS_CHILD | WS_VISIBLE , 200, 130,250, 30, Dlg, 0, hInstance, 0);
             hcadre  = CreateWindow("BUTTON", "Cliquez sur un bouton :", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 100, 70,400, 180, Dlg, 0, hInstance, 0);
             hquitter = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE , 260, 320,80, 30, Dlg, (HMENU)Quitter, hInstance, 0);
             return 0;
         }

    case WM_CLOSE: //clic sur la croix de fermeture
        {
         EndDialog(Dlg,0);
        }

    case WM_COMMAND:    
        {
         switch(LOWORD(wParam))
         {
                 case Bouton1: //clic sur le bouton 1
                 {
                     SetWindowText(hstatic,"Vous avez cliqué sur le bouton 1");
                     break;
                 }
                 case Bouton2: //clic sur le bouton 2
                     {
                    SetWindowText(hstatic,"Vous avez cliqué sur le bouton 2");
                    break;
                     }
                 case Quitter: //clic sur le bouton Quitter
                     {
                         EndDialog(Dlg,0);
                     }
         }
        }   
        break;
     }
return 0;
}
//----------------------------------------------------------------------------------------------------------------------------------------------------

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.