IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[Débutant]Réafficher une boite de dialogue


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut [Débutant]Réafficher une boite de dialogue
    Salut,

    Je suis débutant en prog windows donc vous moquez pas

    En fait j'ai ma boite dialogue principal qui affiche une liste contenue dans un fichier.

    Puis j'ai ma boite de dialgue qui permet de rentrer de nouveaux éléments dans cette liste.

    Apres avoir rentrer de nouveaux éléments je voudrai que quand on clique sur OK ça réaffiche la boite dialogue principale.

    J'ai déjà essayé plusieurs fois mais j'y arrive pas...

    Merci d'avance

  2. #2
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Salut a toi !

    Peut-tu nous dire le language que tu utilises? Sans cela, il nous est fort difficile de trouver l'instruction qu'il te manque

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Je crois deviner le problème.
    Tu as une fenêtre principale qui ouvre une boite de dialogue et tu veux une fois cette boite fermée réouvrir la fenêtre principale. Question : ta fenêtre principale est-elle inactive (mais visible) ou est-elle détruite pendant l'affichage de ton dialogue.
    Quoi qu'il en soit, l'erreur à ne pas faire est d'afficher ta fenêtre principale depuis ton dialogue. Arrange toi pour maintenir une hiérarchie de fenêtre (parent-enfant) :
    - fenêtre principale
    -> dialogue
    <- retour a le fenêtre principale
    - code de gestion des fenêtres
    -> fenêtre principale
    <- retour au code de gestion
    -> dialogue
    <- retour au code de gestion

    et surtout pas :
    - fenêtre principale
    -> dialogue
    -> fenêtre principale

    Pour se faire c'est très simple, quand il est cliqué sur Ok, ton dialogue se ferme, tout simplement. Tu n'as même pas besoin de code si c'est un vrai dialogue et que ton bouton ID est IDOK. Le code par défaut fermera ton dialogue. Le truc est que le code qui crée ton dialogue doit attendre qu'il se ferme, puis réouvrir ta fenêtre principale.
    Poste le code utilisé pour ouvrir tes 2 fenêtres.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut

    LOL
    Désolé j'ai complétement oublier de préciser ça !!!

    J'utilise le c ou c++.
    Compilateur : Visual C++ 6

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    En fait, pour l'instant ma boite de dialogue qui permet d'ajouter une entrée s'ouvre quand la boite de dialogue principale se ferme= appuie sur ok, cancel (je vous avez prévenu, je débute ... )

    Je n'ai pas réussi a faire autrement car je ne peux pas déclarer 2 fois la fonction Winmain.

    Mon code :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // Prototype de notre fonction
    LRESULT CALLBACK MainProc&#40;HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam&#41;;
    LRESULT CALLBACK MainProc2&#40;HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam&#41;;
    
    
    // initialisation de fenetre windows
    int APIENTRY WinMain&#40;HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow&#41;
    &#123;
     	DialogBox&#40;hInstance,&#40;LPCTSTR&#41;IDD_DIALOG1,NULL,&#40;DLGPROC&#41;MainProc&#41;; //menu princip
    	DialogBox&#40;hInstance,&#40;LPCTSTR&#41;IDD_NEW,NULL,&#40;DLGPROC&#41;MainProc2&#41;;  //ajout produit
    	//return 0;
    &#125;
    *boite dialogue principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    //************************************************************************************
    //MENU PRINCIPAL
    //************************************************************************************
    
    // Procédure de gestion de la boite de dialogue
    LRESULT CALLBACK MainProc&#40;HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam&#41;
    &#123;
    	HWND hCtrl;		// On aura besoin d'un handle pour ne pas faire d'appels successifs à GetDlgItem&#40;&#41;
    	int Select,i;
    	char buf&#91;256&#93;;	// Un buffer pour stocker le nom de l'entrée à ajouter
    	switch&#40;message&#41;
    	&#123;
    	case WM_INITDIALOG&#58;
    		// Initialisation de la boite de dialogue
    		
    		// On récupère un HWND sur le controle auquel on va envoyer les messages
    		hCtrl=GetDlgItem&#40;Dlg,IDC_COMBO&#41;;
    		
    		setWindowPos&#40;hCtrl,NULL,NULL,NULL,100,300,SWP_NOZORDER|SWP_NOMOVE&#41;;
    		
    		
    		// On donne une sélection par défaut pour qu'un choix soit forcément fait
    		SendMessage&#40;hCtrl,CB_SETCURSEL,0,NULL&#41;;
    		return 0;
    	case WM_COMMAND&#58;
    		Select=LOWORD&#40;wParam&#41;;
    		switch&#40;Select&#41;
    		&#123;
    		case IDC_ADD&#58;
    			// On récupère un HWND sur le controle auquel on va envoyer les messages
    			hCtrl=GetDlgItem&#40;Dlg,IDC_COMBO&#41;;
    			
    			// On récupère le nom à donner
    			GetDlgItemText&#40;Dlg,IDC_EDIT,buf,32&#41;;
    
    		    // On récupère un HWND sur le controle auquel on va envoyer les messages
    			hCtrl=GetDlgItem&#40;Dlg,IDC_LIST&#41;;	
    
    
        //Affichage de la liste des produits		
    	FILE *fl;
        
        fl = fopen &#40;MY_PATH4, "r"&#41;;
       
    
    
        while &#40;fin!=1&#41;
         &#123;
          /* lecture des lignes */
          fgets &#40;ligne, sizeof ligne, fl&#41;;
    
    
    	
    	// On ajoute l'entrée
    	SendMessage&#40;hCtrl,LB_ADDSTRING,NULL,&#40;LPARAM&#41;&#40;LPCTSTR&#41;ligne&#41;;   //ligne=buf
    	      
          
           if &#40;feof&#40;fl&#41;&#41;	fin=1;
      
           if &#40;ferror&#40;fl&#41;&#41;	fin=1;
       
          &#125;   
          
          /* Fermeture du fichier */
          fclose &#40;fl&#41;;
          fin=0;
    	 return TRUE;
    
    		
    		
    /* Quand appuie sur ok et sur cancel */
    		case IDOK&#58;
    			EndDialog&#40;Dlg,0&#41;;
    			return TRUE;
    		case IDCANCEL&#58;
    			EndDialog&#40;Dlg,Select&#41;;
    			return TRUE;
    		&#125;
    	default&#58;
    		return FALSE;
    
    	&#125;
    &#125;
    *boite de dialogue ajout produit liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    //************************************************************************************
    //AJOUT DE NOUVEAUX PRODUITS
    //*********************************************************************************
    
    // Procédure de gestion de la boite de dialogue
    LRESULT CALLBACK MainProc2&#40;HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam&#41;
    &#123;
    	HWND hCtrl;		// On aura besoin d'un handle pour ne pas faire d'appels successifs à GetDlgItem&#40;&#41;
    	int Select,i;
    	char buf&#91;256&#93;;	// Un buffer pour stocker le nom de l'entrée à ajouter
    	switch&#40;message&#41;
    	&#123;
    	case WM_INITDIALOG&#58;
    		// Initialisation de la boite de dialogue
    		
    		
    		// On récupère un HWND sur le controle auquel on va envoyer les messages
    		hCtrl=GetDlgItem&#40;Dlg,IDC_COMBO&#41;;
    
    		// On récupère un HWND sur le controle auquel on va envoyer les messages
    			hCtrl=GetDlgItem&#40;Dlg,IDC_LIST&#41;;
    
    
    		//Affichage de la liste des produits		
    	FILE *fl;
        
        fl = fopen &#40;MY_PATH4, "r"&#41;;   
    
    	while &#40;fin!=1&#41;
         &#123;
          /* lecture des lignes */
          fgets &#40;ligne, sizeof ligne, fl&#41;;
    	
    	// On ajoute l'entrée
    	SendMessage&#40;hCtrl,LB_ADDSTRING,NULL,&#40;LPARAM&#41;&#40;LPCTSTR&#41;ligne&#41;; 
          
       if &#40;feof&#40;fl&#41;&#41;	fin=1;
       
       if &#40;ferror&#40;fl&#41;&#41;	fin=1;
       
    	 &#125;   
          
          /* Fermeture du fichier */
          fclose &#40;fl&#41;;
          fin=0;
    	  return TRUE;
    
    
    	  /* Par défaut, un combo a une liste déroulante de taille nulle
    		il faut donc l'agrandir. Si on donne une taille suppérieur au nécessaire
    		le liste sera redimensionnée à la taille exacte */
    		SetWindowPos&#40;hCtrl,NULL,NULL,NULL,100,300,SWP_NOZORDER|SWP_NOMOVE&#41;;
    		
    		
    		// On donne une sélection par défaut pour qu'un choix soit forcément fait
    		SendMessage&#40;hCtrl,CB_SETCURSEL,0,NULL&#41;;
    		return 0;
    	case WM_COMMAND&#58;
    		Select=LOWORD&#40;wParam&#41;;
    		switch&#40;Select&#41;
    		&#123;
    		case IDC_ADD&#58;
    			// On récupère un HWND sur le controle auquel on va envoyer les messages
    			hCtrl=GetDlgItem&#40;Dlg,IDC_COMBO&#41;;
    
    			// On récupère le nom à donner
    			GetDlgItemText&#40;Dlg,IDC_EDIT,buf,32&#41;;
    			
    						
    			// On récupère un HWND sur le controle auquel on va envoyer les messages
    			hCtrl=GetDlgItem&#40;Dlg,IDC_LIST&#41;;
    
    			// On ajoute l'entrée dans la liste
    	SendMessage&#40;hCtrl,LB_ADDSTRING,NULL,&#40;LPARAM&#41;&#40;LPCTSTR&#41;buf&#41;;   
    	
    			//On ajoute l'entree dans le fichier
    
    	FILE *fl;
        
        fl = fopen &#40;MY_PATH4, "a"&#41;; 
    	fprintf&#40;fl,"\n%s",buf&#41;;
    	fclose&#40;fl&#41;;
    	return TRUE;
    
    			
    		
    		
    /* Quand appuie sur ok et cancel*/
    		case IDOK&#58;
    			EndDialog&#40;Dlg,0&#41;;
    			return TRUE;
    			
    		case IDCANCEL&#58;
    			EndDialog&#40;Dlg,Select&#41;;
    			return TRUE;
    		&#125;
    	default&#58;
    		return FALSE;
    
    	&#125;
    &#125;

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Que veux-tu :
    - ouvrir ta 2° boite par dessus la 1° avec la 1° inactive tant que la 2° n'est pas fermée (=> dialog modal)
    - ouvrir la 1° et la fermer, puis ouvrir la 2° et la fermer puis ouvrir la 1° a nouveau

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    Maintenant que j'y pense, je voudrai bien
    ouvrir la 1ere boite
    puis quand clique ok(pour l'instant) ouvrir la 2eme boite par dessus
    et quand clique ok refermer la 2eme boite et donc la 1ere devrai toujours etre là.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Ok, ben c'est assez simple. Dans MainProc, case WM_COMMAND, rajoute un case sur ton bouton OK dans le switch Select, dans lequel tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    case IDOK&#58;
        if &#40; HIWORD&#40; wParam &#41; == BN_CLICKED &#41; // clic sur OK
        &#123;
            DialogBox&#40;
                hInstance,
                MAKEINTRESOURCE&#40; IDD_NEW &#41;,
                Dlg, // <- la 2° dialog a la 1° comme parent
                MainProc2 &#41;;  
        &#125;
        return 0;
    Et ca devrait marcher. Tant que la 2° boite ne sera pas fermée, la 1) restera bloquée sur la ligne DialogBox.

    Et bien sûr supprime le 2° appel à DialogBox dans ton main.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    Pour ouvrir soit le menu principal soit la boite de dialogue ajout d'un produit j'ai créer une boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    do
    	&#123;
    		if &#40;menu==1&#41;
    		&#123;
    		DialogBox&#40;hInstance,&#40;LPCTSTR&#41;IDD_DIALOG1,NULL,&#40;DLGPROC&#41;MainProc&#41;; //menu princip
    		menu=0;
    		&#125;
    
    		if &#40;produit==1&#41;
    		&#123;
    
    		DialogBox&#40;hInstance,&#40;LPCTSTR&#41;IDD_NEW,NULL,&#40;DLGPROC&#41;MainProc2&#41;;  //ajout produit
    		produit=0;
    		&#125;
    	&#125;while &#40;sortie==1&#41;;
    	return 0;
    &#125;
    Quand on clique sur cancel ou fermer => ça ferme
    Quand dans le menu on clique sur new produit => ça ouvre boite ajout produit
    Quand dans ajout produit on clique sur OK => on revient au menu

    C'est bon ou pas ?

    Par contre j'arrive pas a faire que ma boite dialogue ajout produit s'ouvre par dessus le menu principal.

    J'ai essayer la méthode de HW et ça me met une erreur : "error C2065: 'DLG' : undeclared identifier".

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    C'est bon dans le sens ou ça marche. C'est moins bon dans le sens ou c'est pas la méthode la plus propre. Si tu as une erreur sur DLG, c'est normal, ça sort d'où DLG ? Le paramètre Dlg de DialogBox doit être le même que le 1° argument du 1° MainProc.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    Désolé je me suis trompé.

    En fait c'est hInstance qui n'est pas reconnu : error C2065: 'hInstance' : undeclared identifier

    Pourtant il est bien déclaré dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int APIENTRY WinMain&#40;HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow&#41;
    Est ce que c'est parce que les lignes que tu m'as données ne sont pas à placer dans cette fonction mais dans une autre plus bas ???

    Pourtant j'ai mis un prototype de WinMain...

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Moui, normal, hInstance est dans WinMain, et le code est bougé.
    Plusieurs solutions :
    - méthode classique : tu déclare un hInstance global que tu initialise dans WinMain avec cekui reçu en paramètre. Dans DialogBox tu utilises le hInstance global (g_hInstance).
    - tu ne te prends pas la tête et utilises GetModuleHandle(NULL) qui te renvoie hInstance.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 145
    Points : 55
    Points
    55
    Par défaut
    C'est bon j'ai réussi

    J'ai mis hInstance en variable globale.

    Meric beuacoup pour ton aide HW !!!

    A bientôt.

    Ce forum est génial !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant]Lancer une boite de dialogue
    Par A_B dans le forum MFC
    Réponses: 2
    Dernier message: 28/09/2008, 07h08
  2. Réponses: 6
    Dernier message: 29/01/2008, 18h47
  3. Réponses: 1
    Dernier message: 22/08/2005, 12h09
  4. Réponses: 5
    Dernier message: 04/04/2003, 15h02
  5. Comment cree une boite de dialogue parcourir
    Par kenshi dans le forum MFC
    Réponses: 5
    Dernier message: 06/01/2003, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo