begin process at 2012 05 29 14:06:37
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 14 novembre 2003 à 23:37:36 | Portée des variables avec MFC : HELP !!!

sprintjeffC

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 ???

...

}
vendredi 14 novembre 2003 à 23:48:36 | Re : Portée des variables avec MFC : HELP !!!

aardman

Membre Club
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.

samedi 15 novembre 2003 à 00:40:17 | Re : Portée des variables avec MFC : HELP !!!

sprintjeffC

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 ???
+
samedi 15 novembre 2003 à 00:50:02 | Re : Portée des variables avec MFC : HELP !!!

aardman

Membre Club
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.
samedi 15 novembre 2003 à 01:07:37 | Re : Portée des variables avec MFC : HELP !!!

sprintjeffC

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;

}
samedi 15 novembre 2003 à 02:13:41 | Re : Portée des variables avec MFC : HELP !!!

aardman

Membre Club
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é.
samedi 15 novembre 2003 à 12:55:00 | Re : Portée des variables avec MFC : HELP !!!

sprintjeffC

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;

}
samedi 15 novembre 2003 à 14:12:27 | Re : Portée des variables avec MFC : HELP !!!

aardman

Membre Club
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.


Cette discussion est classée dans : mfc, hwnd, msg, main, callback


Répondre à ce message

Sujets en rapport avec ce message

ressources et API !!!! [ par Xs ] salut !voila, pour me simplifier la tache, j'utlise les ressources pour creer une boite de dialog (sous VC++ 6).mais j'obtiens, lors de la compilation AU SECOURS PB projet MFC utilisation callback [ par vinceVD ] Je souhaite communiquer entre 2 appli en utilisant les postmessage (j'ai une appli Windev et une appli C++ MFC)Tu coté de windev pas de pb mais du cot aide moi acompiler ce graph stp [ par temoin ] Bonjour mon erreur est ceci je tout suivi a la lettre je mais les link et je installer le sdk de microsoft qui fait le 200 meg et auusi je mais les li crer "dialog non modal" [ par comfm ] BonjourJe n'arrive pas à créer une boite de dialogue non modal, c'est à dire celle qui permet d'être tjs affichée et on peut cliquer derriere sans pro Dll + LoadLibrary [ par Manson ] Salut,voila, j'ai fais une dll dont le code est le suivant :void __declspec(dllexport)show_msg(HWND hWnd, char *msg){ MessageBox(hWnd, msg, "Dll Powa Probleme d affichage [ par Scythale ] Lorsque j'execute ce programme voici ce que dit mon compilateur(borland C++): you have accidentely use the old dummy version of OwlMain.Je n'arrive pa Utilisation d'une fonction callback [ par laurentl2000 ] Bonjour, Voici une fonction callback destinée à envoyer les titres des fenêtres IE ouvertes dans une listbox... BOOL CALLBACK EnumWindowsProc(HWND hwn Colorier un static : HEeeeeeeelp !!! [ par sprintjeffC ] salut @ tousje me mets a la programmation windows en C/C++ (pas VC++ merci ... quitte à faire du microsoft je préfère VB ;-). Je démarrai pas mal et t Prob WIN32 [ par AngeloVivaldi ] bonjour, voici un code ke g tapé pour mon apprentissage de la prog Graphique :#include LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, L CALLBACK ; HWND késako? [ par Spiffou ] bonjour à tous,je débute en c++ et je tente de faire un prog utilisant les threads et les sockets non bloquant...j'ai vu dans plusieurs sources et tut


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales