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 21040 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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
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
Rejoignez-nous