Plusieurs dialog [API]

cs_Xs
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008
- 28 mars 2002 à 15:36
cs_Xs
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008
- 29 mars 2002 à 21:44
voila, je faisait un prog, et pis tout d'un coup, j'ai eu envie de changer son design, qui été deja sous API WIN32.

ce design consiste a avoir une dialog "menu" et en appeler d'autres pour les fonctions :

1er pb : -comment appeler plusieurs dialog, par ex, quand on click qur le bouton "ajouter", on appel la dialog "ADD" ??

2e pb : - comment les faires communiquer entres elles ??

7 réponses

cs_Xs
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

28 mars 2002 à 15:53
j'ai oublié deux choses :
1- les dialog sont des ressources
2- le code :

#include <windows.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <commctrl.h>
#include "resource.h"

FILE *agen;

char art[255];
char tit[255];
char artv[255];
char titv[255];

void file()
{

agen =fopen("liste.lst","a+");

fprintf(agen,"(%s)[%s]\n",art,tit);
fclose(agen);
MessageBox (NULL, "L'auteur et la chanson ont bien été ajouté.", "Ok !", 0 + MB_ICONASTERISK);
}

void verif()
{
int c;
c = 0;
agen =fopen("liste.lst","r");
c= fgetc(agen);

fclose(agen);
}

LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch(msg)
{
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{/*le code un peu casse-cou....
case IDADDSONG:{
{
HINSTANCE hInstance;
int nCmdShow;
HWND hdlg;
MSG Msg;

hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_ADDSONG), NULL, (DLGPROC) DlgProc);

if(hdlg == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

ShowWindow(hdlg, nCmdShow);
UpdateWindow(hdlg);

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}}
break;*/
case IDCADD:
{
GetDlgItemText(hDlg,IDC_ART,art,255);
GetDlgItemText(hDlg,IDC_TIT,tit,255);
SetDlgItemText(hDlg,IDC_STATADD,"Ajout en cours...");
file();
SetDlgItemText(hDlg,IDC_STATADD,"Ajout");
}
break;
case IDC_VER:
{
GetDlgItemText(hDlg,IDC_ARTV,artv,255);
GetDlgItemText(hDlg,IDC_TITV,titv,255);
verif();
}
break;
case IDCANCEL:
DestroyWindow(hDlg);
break;
}
}
break;
default:
return FALSE;
}
return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hdlg;
MSG Msg;

hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) DlgProc);

if(hdlg == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

ShowWindow(hdlg, nCmdShow);
UpdateWindow(hdlg);

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
0
jcecchi
Messages postés
117
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
14 janvier 2003
3
28 mars 2002 à 20:26
>>1er pb : -comment appeler plusieurs dialog, par ex, quand on click qur le bouton "ajouter", on appel la dialog "ADD" ??

Ce qui ne va pas dans ton code c'est que tu n'as qu'une seule procedure DlgProc pour ta boite de dialogue principale.
Dans case IDADDSONG tu cree un nouvelle boite de dialogue mais avec la meme procedure. Il faut donc creer une nouvelle procedure par exemple AddSongProc(.......).
Il faut en faire de meme pour chaque boite de dialogue.
Ensuite tu fais ton
CreateDialog(,,,(DLGPROC)AddSongProc);

De plus pas besoin de creer une nouvelle boucle de message : elle existe deja dans WinMain.

2e pb : - comment les faires communiquer entres elles ??

D'abord il faut creer des messages, par exemple :

#define WM_VALIDSONG WM_USER+1

Et dans la procedure de la boite de dialogue a laquelle doit parvenir ce message tu met
case WM_VALIDSONG:
...

Pour la communication entre boite de dialogue tu fais des SendMessage avec les messages que tu as definis.

J'espere que ca pourra t'aider.
0
cs_Xs
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

28 mars 2002 à 20:44
alors voila, j'ai fait comme tu m'a dit : mais la y'a pas d'erreurs, de warnings, ou autre mais quand je click sur le bouton "ajouter une chanson", rien ne se passe.

#include <windows.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <commctrl.h>
#include "resource.h"

FILE *agen;

char art[255];
char tit[255];
char artv[255];
char titv[255];

void file()
{

agen =fopen("liste.lst","a+");

fprintf(agen,"(%s)[%s]\n",art,tit);
fclose(agen);
MessageBox (NULL, "L'auteur et la chanson ont bien été ajouté.", "Ok !", 0 + MB_ICONASTERISK);
}

void verif()
{
int c;
c = 0;
agen =fopen("liste.lst","r");
c= fgetc(agen);

fclose(agen);
}

LRESULT CALLBACK AddSongProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch(msg)
{
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{
case IDCADD:
{
GetDlgItemText(hDlg,IDC_ART,art,255);
GetDlgItemText(hDlg,IDC_TIT,tit,255);
SetDlgItemText(hDlg,IDC_STATADD,"Ajout en cours...");
file();
SetDlgItemText(hDlg,IDC_STATADD,"Ajout");
}
break;
case IDCANCEL:
DestroyWindow(hDlg);
break;
}
}
break;
default:
return FALSE;
}
return FALSE;
}

LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{

switch(msg)
{
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{
case IDADDSONG:
hDlg = CreateDialog(NULL,MAKEINTRESOURCE(IDD_ADDSONG), NULL, (DLGPROC) AddSongProc);
if(hDlg == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
break;
case IDCADD:
{
GetDlgItemText(hDlg,IDC_ART,art,255);
GetDlgItemText(hDlg,IDC_TIT,tit,255);
SetDlgItemText(hDlg,IDC_STATADD,"Ajout en cours...");
file();
SetDlgItemText(hDlg,IDC_STATADD,"Ajout");
}
break;
case IDC_VER:
{
GetDlgItemText(hDlg,IDC_ARTV,artv,255);
GetDlgItemText(hDlg,IDC_TITV,titv,255);
verif();
}
break;
case IDCANCEL:
DestroyWindow(hDlg);
break;
}
}
break;
default:
return FALSE;
}
return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hdlg;
MSG Msg;

hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) DlgProc);

if(hdlg == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}

ShowWindow(hdlg, nCmdShow);
UpdateWindow(hdlg);

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}

et comme tu vois, a l'endroit ou la dialog devrait se creer/afficher, rien ne se passe, mais en plus, etonnant, la creation de la fenetre n'echoue meme pas et la fonction est bien lu !! (donc devrait avoir été executé)....

c'est a rien n'y comprendre !
0
jcecchi
Messages postés
117
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
14 janvier 2003
3
29 mars 2002 à 12:24
Ok, tu as bien enlever la deuxieme boucle de message, mais il faut quand meme laisser le ShowWindow et le UpdateWindow pour l'affichage de la boite de dialogue.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Xs
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

29 mars 2002 à 18:39
voila, ca marche !

mais toujours un pb :
quand je demande de fermer la seconde boite de dialog, c'est une fermeture globale : tu le programme ce termine alors que moi, je veux juste fermer la seconde boite

kesako ?
0
jcecchi
Messages postés
117
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
14 janvier 2003
3
29 mars 2002 à 20:00
Dans AddSongProc->WM_DESTROY ne fais pas PostQuitMessage(0) mais EndDialog(hDlg)

PostQuitMessage te fais sortir de ta boucle de message et quitter l'application.
0
cs_Xs
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

29 mars 2002 à 21:44
Un grand merci !
0