IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Accéder aux fonctions et variables membres dans 1 fct static


Sujet :

C++

  1. #1
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut Accéder aux fonctions et variables membres dans 1 fct static
    Bonjour à tous,
    Je suis en train de développer une classe permettant de créer un controle personnalisé sous Windows et j'effectue un subclassing pour gérer les différents évenements.
    Or pour que ma fonction aie le bon prototype, je dois la déclarer en static pour ne pas que le paramètre this soit passé.
    Le problème c'est que, naturellement, je ne sais plus quel objet a appelé la procédure.
    Y-a-t-il moyen de le connaître quand même?

    Merci d'avance,
    Crisanar

    (Je pense que c'est un problème de C++ mais la solution dépendra peut-être de l'environnement Windows. Si le forum n'est pas approprié, je m'en excuse)

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    S'il faut avoir un prototype précis, je suppose que c'est pour une fonction Callback, sans doute la WindowProc ?
    Je viens de voir la même chose dans les tutoriels COM : tu stockes this dans la mémoire de la fenêtre avec SetWindowLong (tu peux utiliser l'index GWL_USERDATA pour les fenêtres et boites de dialogue ou pour un contrôle créé par toi-même, mais pour les autres contrôles, il est possible qu'il soit déjà utilisé: Il te faudra alors utiliser les extra bytes (et les réserver en donnant la bonne taille au paramètre cbWndExtra de ta WindowClass))

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 755
    Points : 10 724
    Points
    10 724
    Billets dans le blog
    3
    Par défaut
    Problème classique lorsqu'on encapsule Win32. Plusieurs possibilités:
    - associer le pointeur this au handle via la méthode de Médinoc. Comme il l'a dit, ça peut être modifié par n'importe qui donc moyennement fiable. Mais c'est simple...
    - associer le pointeur this au handle via une map, comme le font les MFC
    - générer un delegate (thunking) : tu compiles en quelques sorte à la volée une WndProc qui contient en dur le pointeur this. Ca consiste à allouer de la mémoire exécutable et à écrire des opcodes x86... c'est ce que fait ATL
    http://www.rpi.edu/~pudeyo/articles/wndproc/

  4. #4
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    C'est bien pour une WndProc callback.
    J'utilise la méthode du GWL_USERDATA actuellement, mais effectivement j'ai peur qu'il ne soit déja utilisé ou que l'utilisateur le modifie par la suite.
    Pour les extras bytes, si j'utilise des controles crées dans en ressource, est-ce possible des les utiliser? Et plus généralement, comment les initialiser et les récupérer?

    D'avance, merci à tous

    EDIT : merci pour le lien, c'est très intéressant

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Un autre truc possible (mais bien lent) c'est d'utiliser les "Window properties" (voir fonction SepProp()).

    Tu peux aussi faire des trucs plus compliqués (et pas forcément plus rapides) en créant une childwindow servant uniquement à y faire des Get/SetWindowLong()... Mais comme il faut déjà récupérer son handle par son ID, le GetProp() est peut-être plus rapide que GetDlgItem()/getWindowLong()... Je n'ai pas fait de tests comparatifs...

  6. #6
    Membre habitué Avatar de Crisanar
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 162
    Points : 137
    Points
    137
    Par défaut
    Je vais tenter de me débrouiller avec ce que vous m'avez donné.

    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 28/04/2015, 19h28
  2. Réponses: 0
    Dernier message: 31/03/2010, 17h21
  3. [Smarty] Comment accéder aux propriétés d'un objet dans un objet ?
    Par Tanebisse dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/11/2008, 13h36
  4. Réponses: 0
    Dernier message: 03/05/2008, 16h13
  5. Réponses: 4
    Dernier message: 28/03/2005, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo