Application basée boite de dialogue sans ressources

0/5 (25 avis)

Vue 7 769 fois - Téléchargée 581 fois

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

Ajouter un commentaire Commentaires
scolinks Messages postés 69 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 19 octobre 2005 6
19 sept. 2004 à 08:05
10 sur 10... Tres pratique...
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
19 sept. 2004 à 18:02
Deja fait par monsieur Arnotic:
http://www.cppfrance.com/code.aspx?id=25149
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
19 sept. 2004 à 20:08
vecchio56 > Oui mais c'est pas du tout la même chose. La méthode utilisée est tout à fait différente. Monsieur Arnotic a fait appel à la fonction CreateWindowEx() pour créer une fenêtre normale ayant l'apparence d'une boite de dialogue. Ce qui présente quelques inconvénients. Déjà la présence de l'icone à côté du nom prouve que ce n'est pas une vraie boite de dialogue. Dans mon source, j'utilise la fonction DialogBoxIndirect() pour créer une vraie boite de dialogue, plus facile à réaliser et surtout plus souple dans son fonctionnement.
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
19 sept. 2004 à 21:03
vecchio56 > En tous cas merci pour le rappel. Je suis sûr que tu n'avais pas pris le temps de comparer les deux sources.
A+
MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 11
20 sept. 2004 à 08:55
10 / 10 . Franchement bien.
Cependant, question : peut on programmer plusieurs boîtes de dialogue de ce type et les faire afficher en même temps ???

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.