[API][WIN32] Enregistrement de classe de fenêtre

Utilisateur anonyme - 28 mai 2004 à 17:50
 Utilisateur anonyme - 30 mai 2004 à 18:23
Bonjour,

J'ai un problème pour enregistrer une classe de fenêtre.

J'utilise GetClassInfoEx() pour extraire les infos de la classe EDIT créée par Windows.
Ensuite je modifie certains paramètres et j'essaye d'enregistrer cette classe de fenêtre.

Voici le code :

WNDCLASSEX wc;
                  
if(GetClassInfoEx(NULL, "EDIT", &wc) != 0)   {
MaFenetre->oldProc = wc.lpfnWndProc;
                        
wc.lpfnWndProc = (WNDPROC)EdProc;
wc.lpszClassName = "MonEdit";
                                                
if( ! RegisterClassEx(&wc) )       {

...	// GetLastError()

}



Lorsque je compile, pas de problème : aucun warning, aucune erreur.
Lorsque j'éxécute, GetLastError() me dit : paramètre incorrect.

Je ne peux pas faire un sous-classement classique (avec SetWindowLong) car la procédure de sous classement est une fonction membre statique d'une classe, et j'ai besoin d'accèder à un pointeur d'objet dans cette fonction.

Quelqu'un auraît une idée ?

Merci !

3 réponses

Utilisateur anonyme
29 mai 2004 à 09:05
Bonjour,

Pour info : j'ai réussi à régler le problème de l'enregistrement de la classe modifiée : il suffit de définir le paramètre cbSize de la structure WNDCLASSEX avant l'appel de la fonction GetClassInfoEx() :

WNDCLASSEX wc;

wc.cbSize        = sizeof(WNDCLASSEX);

if(GetClassInfoEx(NULL, "EDIT", &wc) != 0)
etc...


Et accessoirement, redéfinir aussi le paramètre hInstance de cette même structure (après l'appel de GetClassInfoEx()).

Maintenant, j'ai un autre problème : une fois cette classe enregistrée, je n'arrive pas à créer une fenêtre correspondante.
J'ai identifié le problème : il ne trouve pas ma procédure de callback Edproc, et du coup ne créé pas la fenêtre.
Si j'éxécute le code suivant :
WNDCLASSEX wc;
wc.cbSize        = sizeof(WNDCLASSEX);

if(GetClassInfoEx(NULL, "EDIT", &wc) != 0)   {
MaFenetre->oldProc = wc.lpfnWndProc;

wc.lpszClassName = "MonEdit";
wc.lpfnWndProc = (WNDPROC)EdProc;

RegisterClassEx(&wc);
}
                  
HWND ThehWnd = CreateWindowEx(	WS_EX_OVERLAPPEDWINDOW,
"MonEdit",
NULL,
ES_LEFT | WS_CHILD | WS_BORDER | ES_MULTILINE,
20, 85,
430, 120,
hWnd,
(HMENU)ID_CHAINE,
hProgInstance,
0
);

if( ! ThehWnd )      {
RetourneErreur();		//	GetLastError()
}


GetLastError() me retourne : "Le fichier spécifié est introuvable"
Il suffit que je mette la ligne suivante en commentaire :
wc.lpfnWndProc = (WNDPROC)EdProc;

Et plus d'erreur, l'edit est bien créé et apparraît...

La fonction EdProc est un membre statique de classe.

Help please :o)
0
Utilisateur anonyme
29 mai 2004 à 13:00
Bon, je ne comprends pas... çà ne veut pas fonctionner.
C'est vraiment bizarre, d'autant plus étrange, que je fais exactement la même chose quelques lignes au dessus pour créer ma 1ère fenêtre, et çà marche.
Et la meilleure dans tout çà, c'est que j'ai trouvé des exemples sur le net qui expliquent exactement ce que je suis en train de faire (le superclassing, ou surclassement en français).
Mais non, il ne veut pas prendre en compte ma fonction EdProc.
Et çà n'a rien à voir avec le fait que ce soit une fonction membre statique, car j'ai essayé avec une fonction globale et çà fait pareil...

Si quelqu'un a une idée, là c'est le moment, car je suis à cours...
0
Utilisateur anonyme
30 mai 2004 à 18:23
Si par hasard quelqu'un tombe un jour sur ce topic, je vais donner la solution.

Après m'être arraché les cheveux une bonne centaine de fois, et après une petite restructuration de mon code, qui au passage, n'a pas fait de mal, la solution m'est venue d'un coup.

En fait je fais de la POO pure, c'est à dire sans aucune variable globale.
Il suffisait en fait de déclarer le membre oldProc de la classe en question static.
Sans cela, çà ne fonctionnait pas. Et pourtant, à la compilation çà passait nickel, aucun warning, aucune erreur. C'est à l'éxécution que çà plantait.

Voilà, merci de votre soutien :o)
0
Rejoignez-nous