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

Windows Discussion :

Recupérer la structure CREATESTRUCT


Sujet :

Windows

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Recupérer la structure CREATESTRUCT
    Bonjour,

    Je commence à apprendre l'API Windows, notamment grâce aux cours de Jessee Edouard (melem) que je trouve vraiment très bien faits.

    J'ai pu remarqué dans d'autres cours, sur ce site comme sur d'autres, pour aller au plus simple, on utilisait souvent une variable globale pour récupérer l'instance du programme quand on en a besoin.

    Dans les cours de Melem, il utilise le champ hInstance de la structure CREATESTRUCT passée dans lParam lorsqu'un message WM_CREATE est envoyé. (si j'ai bien compris )

    Mais j'ai une question, peut-on récupérer cette structure en dehors du bloc qui traite ce message (dans celui de WM_PAINT par exemple) ?

    Pour l'instant ce que j'ai essayé de faire c'est créer un pointeur LPCREATESTRUCT dans la callback et j'ai essayé d'y copier l'adresse de la structure CREATESTRUCT dans le WM_CREATE

    Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static LPCREATESTRUCT lpCreateStruct; 
      switch(message)
      {
       case WM_CREATE:		
    	pCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);	
    	break;
    Mais visiblement c'est pas aussi simple car si j'essaie par exemple de récupérer un champ de la structure dans le bloc de WM_PAINT, ça ne marche pas.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       case WM_PAINT:
            bitmap = LoadBitmap(lpCreateStruct->hInstance,TEXT("IMG_TEST"));
            //BeginPaint, DrawState et tout le tralala..
            break;
    ne fonctionne pas (bitmap est NULL mais pas lpCreateStruct->hInstance) alors que si je remplace la partie en rouge par une globale, ça marche. Je sais bien que je ne dois pas recharger mon image dans le WM_PAINT à chaque fois mais c'est juste un exemple.

    Je ne comprends pas bien le mot clé static ou bien la structure est supprimée quand CreateWindow() a retourné et il faut alors en faire carrément une copie ou... ?

    C'est pas vraiment un problème car j'en ai pas besoin pour l'instant mais c'est juste une question comme ça qui me tracasse..

    Merci à ceux qui voudront bien me répondre.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 109
    Points : 168
    Points
    168
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      static HINSTANCE hInstance;
    
      switch(message)
      {
        case WM_CREATE:		
    	hInstance = ((LPCREATESTRUCT)lParam)->hInstance;	
    	break;

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par BlueBill Voir le message
    peut-on récupérer cette structure en dehors du bloc qui traite ce message ?
    Non, l'adresse de la structure contenue dans lParam n'est valide que le temps de traitement du message WM_CREATE. En dehors de ce temps, l'adresse pourrait déjà contenir autre chose, ou "rien". Ce que tu peux faire, c'est copier les données dont tu as besoin dans des variables. Ces variables doivent être de classe static pour qu'elles conservent leurs valeurs pendant tout le temps d'exécution du programme, comme les variables globales, même si elles sont déclarées localement dans une fonction.

    Citation Envoyé par BlueBill Voir le message
    alors que si je remplace la partie en rouge par une globale, ça marche.
    Un HINSTANCE global je suppose, mais certainement pas un LPCREATESTRUCT global ...

  4. #4
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par BlueBill Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       case WM_PAINT:
            bitmap = LoadBitmap(lpCreateStruct->hInstance,TEXT("IMG_TEST"));
            //BeginPaint, DrawState et tout le tralala..
            break;
    Tous les champs de la structure CREATESTRUCT peuvent être retrouvés par d'autres moyens, ça ne sert à rien de la conserver. Par exemple, pour le handle d'instance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hInstance = reinterpret_cast<HINSTANCE>(GetWindowLong(hWnd, GWL_HINSTANCE));

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Melem Voir le message
    Non, l'adresse de la structure contenue dans lParam n'est valide que le temps de traitement du message WM_CREATE. En dehors de ce temps, l'adresse pourrait déjà contenir autre chose, ou "rien". Ce que tu peux faire, c'est copier les données dont tu as besoin dans des variables
    Oui, c'est ce que j'ai pu apercevoir en essayant mais merci de confirmer.

    Citation Envoyé par Melem Voir le message
    Ces variables doivent être de classe static pour qu'elles conservent leurs valeurs pendant tout le temps d'exécution du programme, comme les variables globales, même si elles sont déclarées localement dans une fonction.
    Pareil, en vérifiant, je m'en suis rendu compte.

    Citation Envoyé par Melem Voir le message
    Un HINSTANCE global je suppose, mais certainement pas un LPCREATESTRUCT global ...
    Oui bien sûr, c'est ce que je voulais dire, pardon j'aurais du préciser.

    Je vais donc basculer le sujet en résolu, en te remerciant encore pour tes trois chapitres, notamment tout le passage sur le dessin et la GDI qui peut faire peur quand on débute. Maintenant j'ai vraiment l'impression qu'on a essayé de me faire peur en me disant que l'API Windows c'est beaucoup trop compliqué.

    Citation Envoyé par 10_GOTO_10 Voir le message
    Tous les champs de la structure CREATESTRUCT peuvent être retrouvés par d'autres moyens, ça ne sert à rien de la conserver. Par exemple, pour le handle d'instance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hInstance = reinterpret_cast<HINSTANCE>(GetWindowLong(hWnd, GWL_HINSTANCE));
    C'est ce que je me demandais justement.. quand on commence, on se pose pleins de questions comme ça tu sais et au final, après avoir fait un tour sur MSDN (qui était encore du charabia pour moi il y a quelques temps mais une fois les bases comprises, c'est bon) on se rend compte bien souvent qu'on se casse la tête pour rien.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2014, 13h06
  2. Réponses: 2
    Dernier message: 16/04/2010, 08h29
  3. [SQL2005] Recupération de la structure d'une base
    Par geof dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/02/2008, 10h38
  4. recupérer la Structure d'une base de données oracle
    Par magboom dans le forum Import/Export
    Réponses: 5
    Dernier message: 08/09/2007, 15h33
  5. Script sql recupérant la structure ET les données.
    Par __fabrice dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/01/2006, 14h17

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