Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

appel fonction statique d'une classe

6 réponses
Avatar
Marc Lebrun
Bonjour,

J'ai un léger problème et j'aimerais avoir votre avis.
J'ai une classe dans laquelle je dois utiliser l'adresse d'une fonction
membre, qui du coup a dû être déclarée static. Jusque là pas de problème
(voir le code ci-dessous, c'est ma fonction TWindow::WndProc).
Seulement, dans cette fonction j'ai besoin de faire des appels à d'autres
fonctions membres qui ne sont pas statiques (par exemple ma fonction
TWindow::WMPaint).
Je pense que vous voyez bien le but que je cherche à atteindre :-)
Et bien sûr, l'appel d'une fonction non statique à partir d'une fonction
statique est interdit.
Que me conseillez-vous ???

class TWindow
{
public:
void WMPaint();
private:
static LRESULT CALLBACK WndProc(...);
};

TWindow::TWindow(...)
{
...
wndclass.lpfnWndProc = WndProc;
...
}

LRESULT CALLBACK TWindow::WndProc(...)
{
...
WMPaint();
...
}

Merci :-)
Marc.

6 réponses

Avatar
Fabien LE LEZ
On Mon, 24 Nov 2003 02:39:10 +0100, "Marc Lebrun"
wrote:

Que me conseillez-vous ?


Comme d'habitude : faire en sorte que la fonction statique soit
appelée avec l'adresse de l'objet concerné.

--
;-)

Avatar
Marc Lebrun
Comme d'habitude : faire en sorte que la fonction statique soit
appelée avec l'adresse de l'objet concerné.


???

Merci, mais pourrais-tu être un peu plus précis ?

Marc.

Avatar
Loïc Joly
Marc Lebrun wrote:
Comme d'habitude : faire en sorte que la fonction statique soit
appelée avec l'adresse de l'objet concerné.



???

Merci, mais pourrais-tu être un peu plus précis ?


En général, les fonctions callback peuvent prendre un paramètre dans
lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre
l'adresse de l'objet dont tu souhaite appeller une fonction membre, et
dans la fonction statique, recaste ce paramètre dans le bon type, et
appèèle la fonction membre sur ce pointeur.

--
Loïc


Avatar
Marc Boyer
Marc Lebrun wrote:
Je pense que vous voyez bien le but que je cherche à atteindre :-)
Et bien sûr, l'appel d'une fonction non statique à partir d'une fonction
statique est interdit.
Que me conseillez-vous ???


class Foo {
public:
int bar(Param p); // methode non statique
};
int barWrapper(Foo& item, Param p){ // fonction que tu peux
// passer à ton callback
return item.bar(p);
}

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Marc Lebrun
En général, les fonctions callback peuvent prendre un paramètre dans
lequel on peut faire passez n'importe quoi. Passe donc dans ce paramètre
l'adresse de l'objet dont tu souhaite appeller une fonction membre, et
dans la fonction statique, recaste ce paramètre dans le bon type, et
appèèle la fonction membre sur ce pointeur.

--
Loïc



Ah ok j'ai compris :-)
Le problème c'est que ma fonction statique est une WNDPROC de Windows, dans
le constructeur de TWindow je donne simplement wndclass.lpfnWndProc WndProc (qui ne marche que si WndProc est un membre statique).
A la limite je reçois dans les paramètres le HWND de la fenêtre, c'est
tout...
Je vais peut-être regarder du côté de WNDCLASSEX ???

Merci pour vos réponses.

Marc.

Avatar
Marc Lebrun
Je vais peut-être regarder du côté de WNDCLASSEX ???


Ou bien je met le pointeur "this" dans la zone mémoire qu'on peut réserver
grâce au cbWndExtra de WNDCLASS.
Que je récupère avec GetWindowLong(hWnd ...) dans ma fonction WndProc, ça
devrait marcher !!!

Marc.