Portée des variables avec MFC : HELP !!!

sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003 - 14 nov. 2003 à 23:37
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 15 nov. 2003 à 14:12
salut,

j'ai commençé à coder pour la 1ere fois en C et MFC avec devc++ ... c cool.

Petit problème toute fois :

j'ai une main (spéciale en MFC) et une procedure callback pour gerer les evenements de la fenetre definie dans cette main. en global, en gros, je n'ai que les handles de fenetre et d'editbox.

setwindowtext ne fonctionne que dans la main et la proc callback. getwindowtext ne fonctionne lui que dans la main ! Pourquoi ? Comment faire pour pouvoir utiliser ces methodes partout ?

ci-joint : mon prg "allégé" ...

merci d'avance !!!
sprintjeff

...

// Déclaration handle de la fenêtre
HWND mhwnd;
// Déclaration handle des editbox
HWND hedbEDB1;
HWND hedbEDB2;

char sTmp[1000]= " ";

LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); // Gestion des évènements sur la fenêtre

// La main avec MFC
int WINAPI WinMain(HINSTANCE FirstInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

MSG msg;
WNDCLASSEX wcedb;
WNDCLASSEX wcbtn;

...

// Boucle qui permet au programme de tourner sans arrêt et de guetter les
// évènement pour les envoyer à la procédure qui les gère (ci dessous)
while (GetMessage(&msg, NULL, 0, 0))
{

// JE "GRUGE" COMME CA avec un buffer en global
// ca marche mais c moche ;-)
GetWindowText(hedbEDB1, sTmp, 1000);

TranslateMessage(&msg);
DispatchMessage(&msg);

}

return msg.wParam;

}

// Evènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

Ici (sur une pression d'un bouton) je dispose du buffer pour bosser avec ce qui est saisi dans mon editbox ... pourquoi un getwindowtext ne marche pas ici ???

...

}

7 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 nov. 2003 à 23:48
Salut,
Vu que hedbEDB1 est en global, GetWindowText(...) devrait fonctionner partout.
Et aussi, ton prog n'est pas en MFC. C'est du C tout simplement.
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
15 nov. 2003 à 00:40
merci pour ta reponse,

je sais mais ça marche pas :-///

MFC c pas pour microsoft framework quelque chose ???
framework pour ensemble de librairies ...
ici c windows.h ...
donc c bien du C avec MFC non ???
+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
15 nov. 2003 à 00:50
Salut,
MFC = Microsoft Foundation Class
C'est un truc MS, donc disponible que sur Visual studio et autres, pas sur Devc++.

Pour GetWindowText(...), est tu sur que le buffer est assez gros et que le HWND est valide ?
Sinon, poste le bout de code qui va pas.
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
15 nov. 2003 à 01:07
ok mais qui a codé windows.h alors ???
je fais donc du MFC "libre" excellent ...

je code depuis des années en VB
pas question que je me mette à vc++
(même s'il est + fort au niveau objet)
j'en ai mare des runtime et des dlls :-)

voici :

met le get et le set dans la main ça marche
la sur le bouton dans la callback : marche pas grrrr ....

merci 1000x !!!

// rappel normes de nommage des variables
// dsl je suis VB-iste à la base ;-)
// 'm' si variable niveau module, rien si local
// sur 3 caratères : rappel type variable
// sur n caracteres : non de la variable
// ex : mhwndMaFenetre = handle pour window niveau module MaFenetre
// si type utilisé une seule fois le préfixe suffit (ex : mhwnd)

#include <windows.h> // include pour programmation windows
#include <string.h> // include pour programmation windows

#define ID_EDITBOX_1 1 // ID editbox
#define ID_EDITBOX_2 2
#define ID_BUTTON_1 1 // ID boutons

HWND mhwnd; // déclaration handle de la fenêtre
HWND hedbEDB1; // déclaration handle des editbox
HWND hedbEDB2;

// Gestion des évènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);

// La main avec MFC
int WINAPI WinMain(HINSTANCE FirstInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

MSG msg;
WNDCLASSEX wcedb;
WNDCLASSEX wcbtn;

// Initialisation classe Editbox
wcedb.hInstance = FirstInstance; // Instance
wcedb.lpszClassName = "NitRic_EditBox"; // Nom de la classe
wcedb.lpfnWndProc = WinProc; // Adresse de la procédure
wcedb.style = CS_DBLCLKS; // Style
wcedb.cbSize = sizeof(WNDCLASSEX); // Taille
wcedb.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Grande icone
wcedb.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Petite icone
wcedb.hCursor = LoadCursor(NULL, IDC_ARROW); // Curseur
wcedb.lpszMenuName = NULL; // Menu
wcedb.cbClsExtra = 0; // ...
wcedb.cbWndExtra = 0; // ...
wcedb.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // Couleur de fond
if (!RegisterClassEx(&wcedb))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe editBox.", "Erreur", MB_OK);
return 0;
}

// Initialisation classe Bouton
wcbtn.hInstance = FirstInstance; // Instance
wcbtn.lpszClassName = "NitRic_Button"; // Nom de la classe
wcbtn.lpfnWndProc = WinProc; // Adresse de la procédure
wcbtn.style = CS_DBLCLKS; // Style
wcbtn.cbSize = sizeof(WNDCLASSEX); // Taille
wcbtn.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Grande icone
wcbtn.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Petite icone
wcbtn.hCursor = LoadCursor(NULL, IDC_ARROW); // Curseur
wcbtn.lpszMenuName = NULL; // Menu
wcbtn.cbClsExtra = 0; // ...
wcbtn.cbWndExtra = 0; // ...
wcbtn.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // Couleur de fond
if (!RegisterClassEx(&wcbtn))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe Bouton.", "Erreur", MB_OK);
return 0;
}

//Instanciation d'une fenêtre
mhwnd = CreateWindowEx(0, "NitRic_EditBox", "Mes listes e-mail ...", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 780, 700, HWND_DESKTOP, NULL,
FirstInstance, NULL);
if (mhwnd == NULL)
{
MessageBox(NULL, "Erreur lors de la création de la fenêtre.", "Erreur", MB_OK);
return 0;
}

//Instanciation des editbox
HWND hedbEDB1 = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL,\
10, 10, 100, 25, mhwnd,\
(HMENU)ID_EDITBOX_1, FirstInstance, NULL);
HWND hedbEDB2 = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL|\
ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|ES_LEFT|\
WS_VSCROLL|WS_HSCROLL,\
10, 50, 750, 645, mhwnd,
(HMENU)ID_EDITBOX_2, FirstInstance, NULL); if (hedbEDB1 NULL && hedbEDB2 NULL)
{
MessageBox(mhwnd, "Erreur lors de la création d'une editbox.", "Erreur", MB_OK);
return 0;
}

// Instanciation des boutons
HWND hbtnBTN1 = CreateWindowEx(0, "BUTTON", "", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|\
BS_NOTIFY|BS_TEXT, 120, 11, 30, 25, mhwnd,\
(HMENU)ID_BUTTON_1, FirstInstance, NULL);
if (hbtnBTN1 == NULL)
{
MessageBox(mhwnd, "Erreur lors de la création d'un boutons", "Erreur", MB_OK);
return 0;
}

// Ecrit 'GO' sur le boutons
SetWindowText(hbtnBTN1, "GO");
UpdateWindow(hbtnBTN1);

// Affichage de la fenêtre
ShowWindow(mhwnd, SW_SHOW);
UpdateWindow(mhwnd);

// Met le focus sur l'editbox 1
SetFocus(hedbEDB1);

// Boucle qui permet au programme de tourner sans arrêt et de guetter les
// évènement pour les envoyer à la procédure qui les gère (ci dessous)
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;

}

// Evènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

char sPassword[50]= " ";

switch (msg)
{

// Fermeture du programme
case WM_DESTROY:

// Ferme le programme
PostQuitMessage(0);
break;

// Fermeture de la fenêtre via le menu système ou la croix(X) noir
case WM_CLOSE:

// Décharge la fenêtre
DestroyWindow(hwnd);
break;

// Réception des évènements sur les objets
case WM_COMMAND:

// Editbox
if (LOWORD(wParam) == ID_EDITBOX_1)
{
switch (HIWORD(wParam))
{

case EN_ERRSPACE:

MessageBox(mhwnd, "Mémoire insuffisante sur la station !!!", "Erreur", MB_OK);
break;

case EN_MAXTEXT:

MessageBox(mhwnd, "Le nombre maximum de caractères dans une editbox a été atteint !!!", "Erreur", MB_OK);
break;

case EN_CHANGE:
//MessageBox(mhwnd, "Le contenu d'une editbox à changé.", "EN_CHANGE", MB_OK);
break;

default:

break;

}

}

// Bouton
// Vérifie que c'est bien le bouton et vérifie qu'on à cliqué dessus if ((LOWORD(wParam) ID_BUTTON_1) && (HIWORD(wParam) BN_CLICKED))
{

GetWindowText(hedbEDB1, sPassword, 49);
MessageBox(mhwnd, sPassword, "Debug", MB_OK|MB_ICONINFORMATION);

SetWindowText(hedbEDB2, "coucou");
UpdateWindow(hedbEDB2);

}

break;

default:

return DefWindowProc(hwnd, msg, wParam, lParam);
break;

}

return 0;

}
0

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

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
15 nov. 2003 à 02:13
Salut,
Windows.h c'est aussi de MS.
Je suis pas expert en MFC, cherche un peu des sources de ce type sur le site, tu verra tout de suite la difference entre du code ecrit sans MFC (comme le tiens) et du code ecrit avec MFC.

Pour GetWindowText, le handle hedbEDB1 est NULL avant d'appeller la fonction...
Par contre je sais pas pourquoi, désolé.
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
15 nov. 2003 à 12:55
merci qd même !

bon j'ai trouvé en me nalladant sur le forum
getwindowtext est une fonction !!!
il faut coder :
int n;
n = getwindowtext ...

pour le handle null je sais pas non plus ce qui se passait ... g repris un programme proche qui marchait et tout est ok maintenant :

// rappel normes de nommage des variables
// dsl je suis VB-iste à la base ;-)
// - 'g' si variable niveau global, rien si local
// - sur 3 caratères : rappel type variable
// - sur n caracteres : non de la variable
// ex : ghwndMaFenetre = handle pour window niveau global MaFenetre
// si utilisé une seule fois le préfixe suffit (ex : ghwnd)

#include <string.h> // pour strcpy, ...
#include <windows.h> // include pour programmation windows

#define ID_EDITBOX_1 1 // ID editbox
#define ID_EDITBOX_2 2
#define ID_BUTTON_1 1 // ID boutons
#define ID_BUTTON_2 2

HWND ghwnd; // Déclaration handle de la fenêtre

HWND ghedbEDB1; // Déclaration handle des editbox
HWND ghedbEDB2;

// Gestion des évènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);

// La main avec windows.h
int WINAPI WinMain(HINSTANCE FirstInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

MSG msg;
WNDCLASSEX wcedb;
WNDCLASSEX wcbtn;

// Initialisation classe Editbox
wcedb.hInstance = FirstInstance; // Instance
wcedb.lpszClassName = "NitRic_EditBox"; // Nom de la classe
wcedb.lpfnWndProc = WinProc; // Adresse de la procédure
wcedb.style = CS_DBLCLKS; // Style
wcedb.cbSize = sizeof(WNDCLASSEX); // Taille
wcedb.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Grande icone
wcedb.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Petite icone
wcedb.hCursor = LoadCursor(NULL, IDC_ARROW); // Curseur
wcedb.lpszMenuName = NULL; // Menu
wcedb.cbClsExtra = 0; // ...
wcedb.cbWndExtra = 0; // ...
wcedb.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // Couleur de fond
if (!RegisterClassEx(&wcedb))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe editBox.", "Erreur", MB_OK);
return 0;
}

// Initialisation classe Bouton
wcbtn.hInstance = FirstInstance; // Instance
wcbtn.lpszClassName = "NitRic_Button"; // Nom de la classe
wcbtn.lpfnWndProc = WinProc; // Adresse de la procédure
wcbtn.style = CS_DBLCLKS; // Style
wcbtn.cbSize = sizeof(WNDCLASSEX); // Taille
wcbtn.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Grande icone
wcbtn.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Petite icone
wcbtn.hCursor = LoadCursor(NULL, IDC_ARROW); // Curseur
wcbtn.lpszMenuName = NULL; // Menu
wcbtn.cbClsExtra = 0; // ...
wcbtn.cbWndExtra = 0; // ...
wcbtn.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // Couleur de fond
if (!RegisterClassEx(&wcbtn))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe Bouton.", "Erreur", MB_OK);
return 0;
}

// Instanciation fenêtre
ghwnd = CreateWindowEx(0, "NitRic_EditBox", "Mes e-mails ...", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 780, 700, HWND_DESKTOP, NULL,
FirstInstance, NULL);
if (ghwnd == NULL)
{
MessageBox(NULL, "Erreur lors de la création d'une fenêtre.", "Erreur", MB_OK);
return 0;
}

// Instanciation editbox
ghedbEDB1 = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL,\
10, 10, 100, 25, ghwnd,\
(HMENU)ID_EDITBOX_1, FirstInstance, NULL);
ghedbEDB2 = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL|\
ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|ES_LEFT|\
WS_VSCROLL|WS_HSCROLL,\
10, 50, 750, 600, ghwnd,
(HMENU)ID_EDITBOX_2, FirstInstance, NULL); if (ghedbEDB1 NULL && ghedbEDB2 NULL)
{
MessageBox(ghwnd, "Erreur lors de la création d'une editbox.", "Erreur", MB_OK);
return 0;
}

// Instanciation bouton
HWND hbtnBTN1 = CreateWindowEx(0, "BUTTON", "", WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|\
BS_NOTIFY|BS_TEXT, 120, 11, 30, 25, ghwnd,\
(HMENU)ID_BUTTON_1, FirstInstance, NULL);
if (hbtnBTN1 == NULL)
{
MessageBox(ghwnd, "Erreur lors de la création d'un bouton", "Erreur", MB_OK);
return 0;
}

// Ecrit 'GO' sur les boutons
SetWindowText(hbtnBTN1, "GO");
UpdateWindow(hbtnBTN1);

// Affichage de la fenêtre
ShowWindow(ghwnd, SW_SHOW);
UpdateWindow(ghwnd);

// Met le focus sur l'editbox 1
SetFocus(ghedbEDB1);

// Boucle qui permet au programme de tourner sans arrêt et de guetter les
// évènement pour les envoyer à la procédure qui les gère (ci dessous)
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;

}

// Evènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

int n;
char sPassword[50] = " ";

switch (msg)
{

// Fermeture du programme
case WM_DESTROY:

// Ferme le programme
PostQuitMessage(0);
break;

// Fermeture de la fenêtre via le menu système ou la croix(X) noir
case WM_CLOSE:

// Décharge la fenêtre
DestroyWindow(hwnd);
break;

// Réception des évènements sur les objets
case WM_COMMAND:

// Les editbox if (LOWORD(wParam) ID_EDITBOX_1 || LOWORD(wParam) ID_EDITBOX_2 )
{
switch (HIWORD(wParam))
{

case EN_ERRSPACE:

MessageBox(ghwnd, "Mémoire insuffisante sur la station !!!", "Erreur", MB_OK);
break;

case EN_MAXTEXT:

MessageBox(ghwnd, "Le nombre maximum de caractères dans une editbox a été atteint !!!", "Erreur", MB_OK);
break;

case EN_CHANGE:
//MessageBox(mhwnd, "Le contenu d'une editbox à changé.", "EN_CHANGE", MB_OK);
break;

default:

break;

}

}

// Bouton
// Vérifie que c'est bien le bouton et vérifie qu'on à cliqué dessus if ((LOWORD(wParam) ID_BUTTON_1) && (HIWORD(wParam) BN_CLICKED))
{

// Affiche un MessageBox
// MessageBox(mhwnd, "Vous avez cliqué sur le Bouton !!!", "BN_CLICKED", MB_OK|MB_ICONINFORMATION);

// Récupère le password
n = GetWindowText(ghedbEDB1, sPassword, 50);

// Le teste
if (strcmp(sPassword,"jay")== 0)
{
SetWindowText(ghedbEDB2, "coucou");
UpdateWindow(ghedbEDB2);
}
else
{
MessageBox(ghwnd, "Accès refusé ...", "Authentification", MB_OK|MB_ICONINFORMATION);
SetWindowText(ghedbEDB2, "");
UpdateWindow(ghedbEDB2);
}

}

break;

default:

return DefWindowProc(hwnd, msg, wParam, lParam);
break;

}

return 0;

}
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
15 nov. 2003 à 14:12
Salut,
Le "n =" devant GetWindowText ne change rien. SetWindowText(...) est aussi une fonction et tu n'a pas besoin de mettre ca devant pour que ca fonctionne.
Aussi, normalement on traite les CreateWindowEx(...) dans le message WM_CREATE de la fenetre.

Enfin, ca marche, c'est le principal.
0
Rejoignez-nous