Application basée boite de dialogue sans ressources

Soyez le premier à donner votre avis sur cette source.

Vue 6 554 fois - Téléchargée 483 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
-
10 sur 10... Tres pratique...
vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7 -
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
7 -
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
7 -
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
269
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
9 -
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.