Mélange entre C++ et Win32

Résolu
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 20 août 2004 à 20:26
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010 - 20 août 2004 à 22:42
J'ai décidé d'encapsuler mes fenêtres dans des classes, mais je me trouve confronté à un problème: en gros je n'arrive pas à changer de WndProc en utilisant une fonction qui fait partie de la classe. Voici un code qui n'a pas de sens mais qui illustre ce probleme:

#include <windows.h>

class c
{
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void f();
};

LRESULT CALLBACK c::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK WndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

void c::f()
{
HWND hWnd;
WNDPROC NewProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG)(LONG_PTR)WndProc2); // OK
NewProc = (WNDPROC)(LONG_PTR)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG)(LONG_PTR)WndProc); //Mache pas
}

int main (int argc, char **argv) 
{
return 0;
}

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 août 2004 à 21:40
windProc doit etre declaree 'static' dans une classe pour que son adresse soit connue a la compilation, serait pas ça ton prob ?

ciao...
BruNews, Admin CS, MVP Visual C++
3
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 21:29
ca compile et ca marche pas ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 août 2004 à 21:36
ca compile pas
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 21:39
il te fais chier avec le WndProc en parametre ? peut etre un cast explicite ?
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 21:42
tout a fais, j'avais meme pas vu, bien joué
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 août 2004 à 21:49
Bravo, mais ca ne m'arrange pas de mettre la fonction en static
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 août 2004 à 21:51
pourquoi, tu voudrais t'en servir comment ?
0
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
20 août 2004 à 22:42
Salut,

Si tu veux profiter des avantages des classes pour cette fonction, il faut noter une chose : En c++, quand tu appele une fonction d'une classe, elle prend en premier parametre le fameux pointeur 'this', ce qui permet lors de l'execution de savoir dans quelle instance la fonction est executé.
Ce parametre est entierement géré par le compilateur, mais il faut savoir qu'il existe. Par contre en déclarant ta fonction en static, alors ce pointeur n'existe pas puisque la fonction n'est pas éxécuté dans le contexte d'une instance de classe, mais un peu comme une fonction C classique.

Bon, pou résoudre ton problème, c'est assez simple il suffit de creer une fonction WindowProc Statique qui s'occupera de retrouver l'instance de la classe a laquelle correspond ta fenetre et appelera le traitement souhaité. Pour retrouver l'instance de ta classe, il suffit de placer le pointeur de cette classe dans le USER_DATA de la fenetre.

Bon l'explication commence a etre longue... regarde plutot ce lien qui est beaucoup plus clair : WindowProc As Class method

A ta place, je jetterais un oeil sur les MFC ou wxWindows, ca t'eviteras de refaire ce que qq'un a déjà fait ;)

A+,
JP.
0
Rejoignez-nous