begin process at 2012 05 29 01:26:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

[C++ API win] fonction membre pour traiter des messages


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

[C++ API win] fonction membre pour traiter des messages

lundi 11 juin 2007 à 20:42:03 | [C++ API win] fonction membre pour traiter des messages

THEwarrior333

[C++ API windows]

Bonjour!

Comment faire pour que la fonction callback de traitement des messages soit membre d'une classe?

Car je suis confronté au problème suivant:

je crée une fenêtre donc je rempli une struture WNDCLASSEX ( ou WNDCLASS ) et comme fonction de traitement des messages j'indique ( champ lpfnWndProc ) la fonction membre MyClass::Proc():

class A
{
    public:
       void Init();
};

class MyClass
{
    public:
       LRESULT CALLBACK Proc( HWND , UTINT , WPARAM , LPARAM );
};

void A::Init()
{
    ...
    WNDCLASSEX wnd;
    wnd.lpfnWndProc = MyClass::Proc;
    ...
}

Et ca ne compile pas! (évidemment car il y a incompatibilité des types)

Comment faire?

Merci pour vos idées!
lundi 11 juin 2007 à 20:53:19 | Re : [C++ API win] fonction membre pour traiter des messages

vicenzo

Membre Club
déclare ta fonction static et ca marchera mieux... Mais n'oublies pas que les membres et fonctions non statiques ne seront plus alors accessible...

Tu donc donc avour un variable globale statique intance de ta classe ou alors  tu peux dans ta fonction intercepter WM_CREATE ou WM_NCCREATE et associer ton instance de ta classe par SetWindowLong....

lundi 11 juin 2007 à 21:07:53 | Re : [C++ API win] fonction membre pour traiter des messages

THEwarrior333

Merci pour ta réponse!

En fait ma fonction doit pouvoir accéder aux membres non statiques.

Donc voila ce que j'ai fait:

Ma fonction Proc n'est plus membre de MyClass, j'ai déclaré un pointeur globalg_MyClass sur l'instance de MyClass
et dans Proc j'accède aux éléments de MyClass par des accesseurs via g_MyClass genre g_MyClass->GetMyVar();

Ca fonctionne mais est-ce une bonne solution?
mardi 12 juin 2007 à 19:04:20 | Re : [C++ API win] fonction membre pour traiter des messages

vicenzo

Membre Club
c'est la premiere solution... qui a les désavantage d'avoir une variable globale et qui est alors unique....
La deuxième solution est plus propre (+objet) car pas de variable globale et tu peux associer une instance de ta classe à chaque fenêtre créee...
mardi 12 juin 2007 à 19:42:55 | Re : [C++ API win] fonction membre pour traiter des messages

THEwarrior333


Je tente la deuxieme solution mais j'ai du mal à la comprendre:

dois-je faire
...
wnd.lpfnWndProc = GlobalProc;
...

LRESULT CALLBACK Proc( HWND hWnd, UTINT uMsg, WPARAM wParam, LPARAM lParam)
{
    ...

    case:
        SetWindowLong(hWnd, GWL_WNDPROC, MyClass::Proc);
        break;
}
mardi 12 juin 2007 à 19:44:22 | Re : [C++ API win] fonction membre pour traiter des messages

THEwarrior333


Pardon j'ai oublié un mot dans le code:

"case WM_CREATE:"


(dommage qu'on ne puisse pas éditer les posts)
mardi 12 juin 2007 à 19:45:54 | Re : [C++ API win] fonction membre pour traiter des messages

THEwarrior333

et zut, encore une coquille, la fonction est

LRESULT CALLBACK GlobalProc( HWND hWnd, UTINT uMsg, WPARAM wParam, LPARAM lParam)

desole je fatigue...
mardi 12 juin 2007 à 20:35:56 | Re : [C++ API win] fonction membre pour traiter des messages

vicenzo

Membre Club
Réponse acceptée !
Ce que tu peux faire :

Tu cree ton object :

A* a = new A(..);

Ensuite, dans une fonction d'initialisation (ou pourquoi dans le constructreur, mais bon...), tu crée ta fenetre par createwindow, dialogbox, ...... Ces fonctions retourne un HWND.

A::init()
{
    HWND hWnd = ........;

    SetWindowLong(hWnd, GWL_USERDATA, this);
}

dans ta class tu une fonction statique tu style :

A* A::getInstanceFromHandle(HWND hWnd)
{
   return   GetWindowLong(hWnd, GWL_USERDATA);
}

et dans ta fonction static Proc :

LRESULT CALLBACK Proc( HWND hWnd, UTINT uMsg, WPARAM wParam, LPARAM lParam)
{
    A a* = A::g
etInstanceFromHandle(hWnd);
    ...
    Et voila...
}

mardi 12 juin 2007 à 20:58:20 | Re : [C++ API win] fonction membre pour traiter des messages

THEwarrior333


Nickel, ca fonctionne, merci beaucoup!
je ne savais pas que l'on pouvait associer ses propres variables à l'instance d'une fenêtre...


Cette discussion est classée dans : fonction, messages, api, membre, myclass


Répondre à ce message

Sujets en rapport avec ce message

dev c++ Api & dll [ par pounch ] Tout d'abord lu a tous comme j'en avais marre de chercher tout seul dans mon coin, ben j'a decidé de veindre Bon voila mon pr Lien DLL 16 / API WIN32 [ par CoreBreaker ] Bonjour quelqu'un sait-il comment une fonction de l'API Win32 dans une DLL 16bits ?Et de manière générale comment appeler une fonction d'une DLL 32bit CallBack dans fonction membre [ par Matt67 ] Bonjour, Je desir mettre une callback (waveInProc) dans une classe en tant que fonction membre...Comment puis-je m'y prendre, un petit exemple serait adresse d'une fonction membre d'une classe [ par gagah1 ] Salut à tous!Je voudrais avoir l'adresse mémoire d'une fonction membre d'une classe, alors que l'ISO C++ l'interdire l'accès.Je m'explique:J'ai une c Accèder à un objet depuis Fonction membre de callback statique [ par Jeffray ] Bonjour,J'ai une fonction membre statique de callback, qui correspond à une classe de fenêtre que j'enregistre.Comment faire pour transmettre à cette Fonction qui dure et boucle des messages [ par albertoC ] Bonjour,Il s'agit d'une application mfc, et j'ai créé une boite de dialogues avec l'assistant vc++6.J'ai écrit une fonction qui est déclenchée par l'a API Win 32 et classe SysListView32 dans fonction CreateWindowEx [ par djeauh ] Bonjour à tous je suis nouveau sur le site et j'ai une petite question. Dans un de mes anciens programme en WIN32 j'ai besoins de créer un controle li Tableau membre [ par ekinox17 ] Bon voila j'ai cree un tableau d'octets du type : BYTE buffer[25]; // a l'interieur de ma classe et en public autant dire que toutes les fonctions peu Accecer a une fonction membre avec des iterateurs (encore une ch'tite question sur la stl) [ par Amanobuo ] Salut, toujours avec la stl en ce moment ! Cette fois j ai un vecteur d'objet et je cherche a supprimer un element du vecteur suivant les proprietes d Fonction membre dans un thread [ par Galmiza ] Bonjour, J'essaie de créer un thread et d'y lancer une fonction 'ClientSend' membre d'une classe avec: m_SendThread = CreateThread(NULL, 0, &ClientSe


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 : 0,640 sec (3)

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