Application basée boite de dialogue sans ressources

Soyez le premier à donner votre avis sur cette source.

Vue 6 628 fois - Téléchargée 484 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

racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7 -
Tu peux t'inspirer de mon code sur la couleur dans les controles:
http://www.cppfrance.com/code.aspx?ID=27889
cs_Omeya
Messages postés
28
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
10 août 2006
-
Merci, je l'avais complètement oublié lol! En fait, je n'avais pas remarqué que le WS_TABSTOP n'était pas spécifié dans ton code.

Je cherche aussi un moyen de changer la couleur du texte des boutons. Si par hasard tu pouvais donner un bout de code, ce serait très sympa :)
J'ai déjà un bout de code, perso, mais il est pas très propre. Je te le posterai demain soir si je peux tout en sachant que ta version pourrait être nettement meilleure.
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
7 -
Salut,
Il suffit d'ajouter le style WS_TABSTOP au controle.
cs_Omeya
Messages postés
28
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
10 août 2006
-
Salut,

Comment fait-on pour passer d'un contrôle à un autre avec la touche TAB? Ca ne marche pas dans cette source :(
Sinon, très bonne source. Ca mérite un bon 10 :)
deck_bsd
Messages postés
1244
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1 -
RACPP ... tu est mon sauveur. j'ai chercher PARTOUT après un exemple claire pour crée une dialogbox SANS RESSOURCE. C'est source est une aide précieuse pour moi. Et continue a nier les ressource :D je suis de tous coeur avec toi. Me too je veu pas utiliser les ressources ( en mm temps j'ai pas le choix , elles bug, mais je suis pas mécontent).

Encore merci pour cette source.

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.