Appli à 2 fenêtres

tophe03
Messages postés
327
Date d'inscription
lundi 24 janvier 2005
Statut
Membre
Dernière intervention
14 avril 2010
- 23 août 2005 à 07:03
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 25 août 2005 à 22:05
Bonjour

J'ai un souci concernant une appli mettant en jeu 2 fenêtres. En fait c'est lors de l'ouverture de la 2ème que le problème se pose. Voici une partie du code:

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HACCEL haccel;


hinst = hinstance;

memset(&wc,0,sizeof(wc));


wc.cbSize = sizeof(wc);
wc.style = 0;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinst;
wc.hIcon = LoadIcon(hinstance,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = "LEMENU";
wc.lpszClassName = "MaWinClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);


if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Erreur dans RegisterClassEx()", "Erreur!", MB_OK | MB_ICONERROR);
return FALSE;
}


memset(&wcg,0,sizeof(wcg));

wcg.cbSize = sizeof(wcg);
wcg.style = 0;
wcg.lpfnWndProc = GraphProc;
wcg.cbWndExtra = 0;
wcg.cbClsExtra = 0;
wcg.hInstance = hinst;
wcg.hIcon = LoadIcon(hinstance,IDI_APPLICATION);
wcg.hCursor = LoadCursor(NULL,IDC_ARROW);
wcg.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcg.lpszMenuName = "GRAPHMENU";
wcg.lpszClassName = "GRAPHWNDCLASS";
wcg.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if(!RegisterClassEx(&wcg))
{
MessageBox(NULL, "Erreur dans RegisterClassEx()", "Erreur!", MB_OK | MB_ICONERROR);
return FALSE;
}


hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "MaWinClass", "Polynômes", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 800, 575, NULL, NULL, hinstance, NULL);
if (!hwnd)
{
MessageBox(NULL, "Impossible de créer la fenêtre principale", "Erreur!", MB_OK | MB_ICONERROR);
return FALSE;
}

ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);


haccel = LoadAccelerators(hinstance, "LesAccel");


while (GetMessage(&msg, NULL, 0, 0) > 0)
{
if (!TranslateAccelerator(hwnd, haccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
.../...
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
.../...
case WM_COMMAND:
if (LOWORD(wParam) == IDM_GRAPH)
{

hGraph = CreateWindowEx(WS_EX_CLIENTEDGE, "GRAPHWNDCLASS", "Courbe Polynôme", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 600, 620, NULL, NULL, hinst, NULL);

if (!hGraph)
{
MessageBox(NULL, "Impossible de créer la fenêtre graphique", "Erreur!", MB_OK | MB_ICONERROR);
return;
}

ShowWindow(hGraph, SW_SHOW);
UpdateWindow(hGraph);
}
}
}

LRESULT CALLBACK GraphProc(HWND hGraph, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
.../...
case WM_PAINT:
{
deg = (int)DialogBoxParam(hinst, "DIALOG2", hGraph, (DLGPROC)Dialog2Proc, (LPARAM)hGraph);
.../...
}

case WM_CLOSE:
{
DestroyWindow(hGraph);
return 0;
}

case WM_DESTROY:
{
ShowWindow(hGraph, SW_HIDE);
return 0;
}

default:
return DefWindowProc(hGraph, uMsg, wParam, lParam);
}
}

Lorsque la fenêtre Graph est ouverte, une boite de dialogue s'ouvre, et c'est là que ça foire. Cette dernière clignote; en fait, c'est comme si elle s'ouvrait indéfiniment, même sans rien entrer (editbox).

Si quelqu'un

10 réponses

BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
23 août 2005 à 09:06
POUR SUR !!! que fait DialogBoxParam dans un WM_PAINT, c'est appelé indéfiniment !!!

ciao...
BruNews, MVP VC++
0
tophe03
Messages postés
327
Date d'inscription
lundi 24 janvier 2005
Statut
Membre
Dernière intervention
14 avril 2010

23 août 2005 à 17:14
ah ok!

Je l'utilise où alors? dans WM_CREATE? ou avant switch(uMsg)?


Merci pour ta réponse.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
23 août 2005 à 17:24
où tu veux, une commande de menu ou autre du moment que tu choisis le moment exact d'afficher cette dialog, mais surement pas dans un message system.

ciao...
BruNews, MVP VC++
0
tophe03
Messages postés
327
Date d'inscription
lundi 24 janvier 2005
Statut
Membre
Dernière intervention
14 avril 2010

23 août 2005 à 22:09
C'est bon, ça marche. Merci pour ton aide.
J'ai un autre souci. Je sais comment récupérer un entier ou une chaine de caractères à partir d'une boite de dialogue, mais comment peut on faire pour récupérer un double?
0

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

Posez votre question
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
23 août 2005 à 22:30
tu récp chaine GetWindowText() et ensuite atof().

ciao...
BruNews, MVP VC++
0
tophe03
Messages postés
327
Date d'inscription
lundi 24 janvier 2005
Statut
Membre
Dernière intervention
14 avril 2010

25 août 2005 à 19:51
salut

Pour récupérer une chaine d'une boite de dialogue, c'est pas mieux d'utiliser GetDlgItemText?
Voilà ce que j'ai fait:
dans la procédure de la boite de dialogue:

case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK )
{

char *string3;
string3 = (char*)malloc(40*sizeof(char));

GetDlgItemText(hDlg, IDE_EDIT3, string3, 40);
EndDialog(hDlg, *string3);
free(string3);
}
return TRUE;
}

dans la procédure de fenêtre:

double f;
char *string3;
string3 = (char*)malloc(40*sizeof(char));

*string3 = DialogBoxParam(hinst, "DIALOG4", hGraph, (DLGPROC)Dialog4Proc, (LPARAM)hGraph);
f = atof(string3);
coefs[q] = f;
free(string3);

Mais la chaine que je récupère ne contient que le premier caractère de ce qui est entré dans la boite de dialogue. Qu'est ce qui ne vas pas dans ce que j'ai fait?
Merci
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
25 août 2005 à 21:19
GetDlgItemText va bon aussi, ça évite juste de stocker un HWND si on ne s'en sert que très peu mais dans tous les cas ça appellera GetWindowText en interne.

EndDialog(hDlg, *string3);
free(string3);
tu retournes par EndDialog l'entier à l'offset 0 de la chaine string3, donc le 1er caractère (string3[0]).

Il faut faire le atof() dans la dialog et le stocker ailleurs, EndDialog ne peut retourner qu'un entier 32 bits et rien d'autre.

ciao...
BruNews, MVP VC++
0
tophe03
Messages postés
327
Date d'inscription
lundi 24 janvier 2005
Statut
Membre
Dernière intervention
14 avril 2010

25 août 2005 à 21:52
Merci pour ton explication, je comprends mieux pourquoi je n'obtiens que le premier caractère.
Une fois que j'ai utiliser atof dans la boite de dialogue,
0
tophe03
Messages postés
327
Date d'inscription
lundi 24 janvier 2005
Statut
Membre
Dernière intervention
14 avril 2010

25 août 2005 à 21:55
désolé, une partie de mon dernier message n'est pas passée. c'est la 2ème fois que ça me fait le coup.
Je diasais donc: une fois que j'ai utiliser atof dans la boite de dialogue, où faut-il stocker la valeur obtenue, comment je la récupère?

Merci pour ta patience.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
25 août 2005 à 22:05
variable globale ou autre, là il n'y a que toi qui peut savoir ce qui convient pour ton prog.

ciao...
BruNews, MVP VC++
0