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

encapsulation API Win en C++

4 réponses
Avatar
Jeremie Fouche
Bonjour

J'avais developpé une IHM ( heureusement, je n'ai pas été trop loin) avec
MFC, et j'ai changé de compilateur pour causes de problemes de compilations
(STL et template); je suis passé a Dev-C++.
Dans ces condition, et dans un but d'apprentissage, je souhaiterai
encapsuler avec mes propres classes l'API windows. J'ai débuté, mais je suis
confrontés à des problemes. Pour infos, n'ayant developpé que sous VC++ avec
MFC, je ne connais pas tres bien le fonctionnement de la pompe a message...

J'ai donc commencé ainsi

class CFenetre
{
public:
CFenetre() {}
virtual ~CFenetre() {}

bool Create(HINSTANCE hInstance, DWORD style, const char* szClassName,
const char* szFenName, HWND pParentWnd);

protected:
HWND m_hwnd;
};

La méthode Create appelant successivement les fonctions RegisterClassEx et
CreateWindowEx.

Le main fonctionne de cette maniere:
int WINAMPI WinMain(...)
{
CFenetre fenetre;
fenetre.Create(...);

while( GetMessage(&msg) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

retrun 0;
}

Mon probleme vient du fait que RegisterWindowEx demande une callback qui
"recoit" les message destinés à la fenetre. Cette callback ne peut pas etre
membre de la classe, et donc this est perdu dans la callback. Dans les MFC,
il existait la méthode CWnd::PreTranslateMessage. J'ai aussi remarqué que
cette fonction existait dans l'API Windows. Par contre, je ne vois pas
comment l'utiliser dans mon cas. J'ai bien comme l'idée qui faudrait que la
pompe a message soit dans la classe CFenetre plutot que dans le WinMain. Je
ne sais pas trop par ou partir.

Merci

--
Jérémie

4 réponses

Avatar
Cyrille Szymanski
On 2004-07-10, Jeremie Fouche wrote:
Mon probleme vient du fait que RegisterWindowEx demande une callback qui
"recoit" les message destinés à la fenetre. Cette callback ne peut pas etre
membre de la classe, et donc this est perdu dans la callback.



Une méthode est de stocker l'adresse de la méthode à appeler en
callback dans la zone utilisateur de la classe fenêtre, puis de passer
comme argument à RegisterWindowEx() une fonction statique qui récupère
l'adresse de la callback et qui appelle la méthode correspondante.

J'ai bien comme l'idée qui faudrait que la pompe a message soit dans
la classe CFenetre plutot que dans le WinMain. Je ne sais pas trop
par ou partir.



Je terminerais la fonction main() par un appel à une méthode de type
app.run() qui fait la boucle de message. Le thread principal sera
alors le thread de l'IHM.

Toutes ces choses sont archi classiques. Si c'était moi je ne
perdrais pas trop de temps dessus et je ne chercherai à disséquer les
toolkits que lorsque j'aurai une bonne vue d'ensemble de ce qui se
fait aujourd'hui.

--
cns
Avatar
Remi Thomas
Jeremie Fouche wrote:
Bonjour

J'avais developpé une IHM ( heureusement, je n'ai pas été trop loin)
avec MFC, et j'ai changé de compilateur pour causes de problemes de
compilations (STL et template); je suis passé a Dev-C++.
Dans ces condition, et dans un but d'apprentissage, je souhaiterai
encapsuler avec mes propres classes l'API windows. J'ai débuté, mais
je suis confrontés à des problemes. Pour infos, n'ayant developpé que
sous VC++ avec MFC, je ne connais pas tres bien le fonctionnement de
la pompe a message...

...

Mon probleme vient du fait que RegisterWindowEx demande une callback
qui "recoit" les message destinés à la fenetre. Cette callback ne
peut pas etre membre de la classe, et donc this est perdu dans la
callback. Dans les MFC, il existait la méthode
CWnd::PreTranslateMessage. J'ai aussi remarqué que cette fonction
existait dans l'API Windows. Par contre, je ne vois pas comment
l'utiliser dans mon cas. J'ai bien comme l'idée qui faudrait que la
pompe a message soit dans la classe CFenetre plutot que dans le
WinMain. Je ne sais pas trop par ou partir.

Merci



Je te conseille la lecture de cet article en français qui répond exactement
à tes questions:
http://www.codeppc.com/evc/articles/pocket3d/pocket3d.htm

Rémi

--
Rémi Thomas - MVP Visual Studio .NET
Développeur Windows indépendant
http://www.xtware.com/cv
Avatar
Jeremie Fouche
Remi Thomas a écrit dans le message :
40f3f360$0$7744$

Je te conseille la lecture de cet article en français qui répond


exactement
à tes questions:
http://www.codeppc.com/evc/articles/pocket3d/pocket3d.htm



Merci beaucoup
Ca correspond tout a fait a mes attentes.

--
Jérémie
Avatar
Aurélien REGAT-BARREL
Un autre bon article, en Anglais :
http://www.relisoft.com/win32/winnie.html

--
Aurélien REGAT-BARREL