begin process at 2012 05 27 13:39:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > APPLICATION BASÉE BOITE DE DIALOGUE SANS RESSOURCES

APPLICATION BASÉE BOITE DE DIALOGUE SANS RESSOURCES


 Information sur la source

Note :
9,71 / 10 - par 7 personnes
9,71 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Débutant Date de création :19/09/2004 Date de mise à jour :19/09/2004 17:23:28 Vu / téléchargé :5 303 / 402

Auteur : racpp

Ecrire un message privé
Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • //----------------------------------------------------------------------------------------------------------------------------------------------------
  • #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;
  • }
  • //----------------------------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------------------------------
#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;
}
//----------------------------------------------------------------------------------------------------------------------------------------------------


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

19 septembre 2004 17:16:51 :
Ajout du ZIP et de la capture d'écran.
19 septembre 2004 17:23:28 :

 Sources du même auteur

Source avec Zip Source avec une capture SOUS-CLASSEMENT DE FENÊTRE D'UN AUTRE PROCESS PAR INJECTION ...
Source avec Zip Source avec une capture FENÊTRE FLOTTANTE SANS FOCUS (WIN32 API)
Source avec Zip Source avec une capture SERVICE WINDOWS DANS UNE DLL LANCÉ PAR SVCHOST.EXE
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI...

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

Commentaires et avis

Commentaire de scolinks le 19/09/2004 08:05:08

10 sur 10... Tres pratique...

Commentaire de vecchio56 le 19/09/2004 18:02:33 administrateur CS

Deja fait par monsieur Arnotic:
http://www.cppfrance.com/code.aspx?id=25149

Commentaire de racpp le 19/09/2004 20:08:52 administrateur CS

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.

Commentaire de racpp le 19/09/2004 21:03:36 administrateur CS

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+

Commentaire de MasterShadows le 20/09/2004 08:55:45

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 ???

Commentaire de vecchio56 le 20/09/2004 10:10:42 administrateur CS

oui désolé!

Commentaire de racpp le 20/09/2004 16:47:14 administrateur CS

MasterShadows > Dans mon source, la boite de dialogue est le support principal de l'application. A partir de la procédure de cette boite principale, et de ses événements, tu peux créer autant d'autres boites que tu veux  et les afficher à la fois. N'oublie surtout pas d'implémenter une procédure pour chacune d'elles afin de bien gérer les messages. Il faut rappeler aussi que la fonction DialogBoxIndirect() est bloquante. Le programme appelant attend que la boite soit fermée.
Tu peux donner d'autres précisions? Car je me demande à quoi peut servir d'afficher toutes les boites à la fois.

Commentaire de vecchio56 le 20/09/2004 18:01:27 administrateur CS

L'avantage des dialog est pourtant l'utilisation de l'éditeur des ressources... Sinon c'est quasiment pareil que de créer une fenêtre normale, à l'exception qu'on n'enregistre pas de classe...

Commentaire de racpp le 20/09/2004 22:45:50 administrateur CS

vecchio56 > Pour créer une boite de dialogue comme interface d'une application, il y'a deux façons. DialogBox() et DialogBoxIndirect(). DialogBox crée la boite selon les paramètres enregistrés dans l'EXE comme ressource. DialogBoxIndirect  fait la même chose mais en cherchant ces paramètres dans une zone de la mémoire. Ce qui nous permet de définir les paramètres pendant l'exécution de l'application avant même l'affichage de la boite. Bref, grâce à cette méthode, on maitrise mieux notre boite. Entre une boite de dialogue et une fenêtre normale il y'a beaucoup de différences. Avec une boite de dialogue, on a juste besoin  d'allouer un peu de mémoire pour la dialog template, définir les propriétés de la boite et enfin la lancer. Pour la fenêtre, c'est autre chose. Il faudra définir tous les membres de la classe. Regarde bien le source de monsieur Arnotic, il a dû définir des membres inutiles comme l'icone, le curseur, la couleur de fond, le nom de la classe etc... il a dû faire appel à des fonctions comme LoadIcon(), LoadCursor(), RegisterClassEx() ShowWindow() UpdateWindow(). Pour gérer les messages il a dû employer les fonctions LoadAccelerators(), GetMessage(), TranslateAccelerator(), TranslateMessage(), DispatchMessage(). C'est toujours ainsi avec les fenêtres normales. Alors qu'on n'a pas besoin de tout cela avec une boite de dialogue. Création simple et gestion des messages autonome. Si tu préfères utiliser l'éditeur de ressources c'est ton choix. Franchement, et je ne suis pas le seul à le penser, quand je travaille avec l'éditeur de ressources, j'ai l'impression d'être en train de faire autre chose que la programmation. C'est frustrant et limite beaucoup la maitrise de la programmation de l'application.
A+

Commentaire de leprov le 21/09/2004 20:38:51

bravo pr le code, tres instructif, 10/10 sans complexe, car meme si ce code est tres simple a comprendre, je savais pas comment faire ce genre de choses, et ca ferait presque un bon tuto.
c'est vrai que je suis d'accord que l'editeur de ressources te donne limpression de pas programmer et de faire completement autre chose, mais y'a quand meme parfois un gain de temps assez significatifs (contre une perte de qualité c'est vrai...moins de précisions ds le graphisme, meme si c'est pas forcément important, etc.....)
en tous les cas, tres pratique, alors je dis bravo et merci

Commentaire de racpp le 22/09/2004 18:11:10 administrateur CS

Merci beaucoup chers amis,
Ca fait toujours plaisir d'entendre quelqu'un qui apprécie ce qu'on fait. Ca m'encourage  à penser à d'autres trouvailles à partager.
A très bientot.

Commentaire de magic_Nono le 24/09/2004 15:16:18

j'ai posté un msg sur le forum il y a qq tps, le but est de faire un formulaire dynamique, je m'y colle depuis un certain tps, & vive le Petz

si qqn ve donner un coup de pouce...

++
Nono.

Commentaire de MasterShadows le 27/09/2004 08:20:03

racpp >> Ben, en fait je suis en train d'écrire un programme qui permettrait à terme de tracer des fonctions polynomiales, des rendements et d'autres styles de courbes. Pour cela il me fallait créer une boite dialogue principale, puis une boite dialogue calculatrice, une boite dialogue de rapport, une bdd de graphe et d'autres dans ce style (6 boites de dialogue au total).
Cependant je les avait créer mais il m'était impossible de les mettre en WS_OVERLAPPEDWINDOW sinon bonjour les bugs, car j'aurais aimé faire comme les activations/désactivations de fenêtre (style vc++ 6).
Mais pour plus de clarté je posterais la source bien qu'elle ne soit (et de loin) pas finie, pour que tu vois ce que je voudrais

Commentaire de racpp le 27/09/2004 15:47:47 administrateur CS

MasterShadows > L'utilisation de beaucoup de boites de dialogues dans une application n'est pas toujours très pratique. Personnellement, dans un programme comme le tien, je préfère utiliser des onglets (Tab Control). Cela permet de supporter un grand nombre de contrôles (boutons, statics, edits, etc...) dans une même boite de dialogue. En cliquant sur l'onglet voulu (calculatrice, rapport, graph etc...) on montre les contrôles voulus et on cache les autres. J'avais fait une application contenant 10 onglets  contenant chacun pas moins de 15 contrôles. Ca fonctionne  sans le moindre problème. En attendant de voir ton code source, j'espère que  la solution des onglets t'est convenable.

Commentaire de MasterShadows le 28/09/2004 13:08:06

racpp > Ton idée d'onglet a du bon, je dirais même qu'elle est excellente car cela me permettrait d'avoir plus de place pour le tracer de graphes.
Cependant, cela ne fais pas excessivement longtemps que je programme sans les MFC, il me faudrait donc que tu me donne le code source du programme de tes dix onglets pour avoir un exemple de codification des onglets.
Quand au code source je la posterais cette semaine.
Mais de toute façon, elle subira une refonte totale...
Allez @+

Commentaire de racpp le 28/09/2004 16:15:37 administrateur CS

MasterShadows > Mon programme des dix onglets est assez long et complexe car il gère une base de données elle aussi complexe. Je vais très bienôt poster un source plus clair, simple et surtout focalisé sur la création d'onglets 100% API (sans ressources). En attendant, voici  des sources sur les onglets dans une boite de dialogue créés avec l'éditeur de ressources (sans MFC):
http://www.cppfrance.com/code.aspx?ID=16835
http://www.cppfrance.com/code.aspx?ID=20182

Commentaire de magic_Nono le 28/09/2004 16:59:56

alors, inscrit chaque controle dans une fenetre différentes, C bcp plus pratique...

Je met à jour MP sur le site ftp donné en lien ds la page de MétaProg
ça te donnera une idée de gestion d'onglets...

très facile à gérer et à modifier en étant totalement i ndépendantes les unes des autres...

++

Commentaire de MasterShadows le 29/09/2004 12:29:22

Merci bien Magic_Nono et racpp , on va aller étudier tout ca et je réécrirais totelement le prog...
D'ici demain vous aurez la version du programme dont j'ai parlé pour vous faire une idée du soft que je prépare.
Allez @+

Commentaire de Nebula le 28/12/2004 01:42:47

Un seul mot : Génial !

Commentaire de Xaviou le 13/01/2005 23:13:28

ça m'a l'air bien tout ça !...

c'est peut-être la solution pour mettre des 'resources' de style dialog dans une lib statique (car si mes souvenirs sont exacts, il n'est pas possible de placer des ressources proprement dites dans une telle librairie)

Commentaire de deck_bsd le 11/04/2006 19:40:20

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.

Commentaire de Omeya le 27/11/2006 13:42:29

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 :)

Commentaire de racpp le 27/11/2006 23:30:44 administrateur CS

Salut,
Il suffit d'ajouter le style WS_TABSTOP au controle.

Commentaire de Omeya le 27/11/2006 23:59:41

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.

Commentaire de racpp le 28/11/2006 00:22:12 administrateur CS

Tu peux t'inspirer de mon code sur la couleur dans les controles:
http://www.cppfrance.com/code.aspx?ID=27889

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,054 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales