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 :

button hors d'un hwnd


Sujet :

Windows

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut button hors d'un hwnd
    bonjour,

    je n'arrive pas à spécifier une méthode callback particulière pour mes buttons.

    Ils utilise la callback de la WND sur laquelle ils sont.

    Or j'ai des buttons qui changent de WND voire qui sont indépendant.

    Comment dans ce cas gérer leur évènements ?

    Ne peut-on pas leur imposer une callback comme les classes que l'on Register soi-même ?

    à l'aide.
    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu peux toujours subclasser ou superclasser un bouton (je te laisse chercher comment sur MSDN) "subclassing" et "superclassing"
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    salut, j'ai subclassé mon button avec setwindowlong et GWL_WNDPROC.

    Les messages semblent bien aller vers la nouvelle procédure btnProc, mais mon button ne se dessine plus...


    EDIT :: SuperClassing j'ai rien trouvé...

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    apparement, il faut, à la fin de la nouvelle callback, appeller l'ancienne (celle de la WND).

    Mais ça me gène vu que dans la callback WND je fais un reinterpret_cast sur le GWL_USERDATA et je le met dans un pointeur vers un objet fenêtre et appelle des méthodes spécifiques.

    Donc si je dirige mon button vers cette callback, il va tenter de convertir mon pointeur button en pointeur fenêtre... plantage.
    Peut-on tester le nom de la classe == "MaClasseRéférencée" à partir d'un hwnd donné ? Celà résoudrait mon pb je pense.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne vois pas trop ce que tu veux dire, ici...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par NiamorH
    je n'arrive pas à spécifier une méthode callback particulière pour mes buttons.
    Ils utilise la callback de la WND sur laquelle ils sont.
    Or j'ai des buttons qui changent de WND voire qui sont indépendant.
    Des controles ont toujours une fenêtre parente.
    Ils ne peuvent pas changer de WND.



    Ne peut-on pas leur imposer une callback comme les classes que l'on Register soi-même ?
    si avec CreateWindow de manière identique à la fenetre parente et en dynamique et qui retourne un HWND sur le bouton.
    Sinon avec GetWindowLong/Word comme le préconise Medinoc

    Comment dans ce cas gérer leur évènements ?
    Avec SendMessage et WM_COMMAND et
    ID du bouton

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Salut Mat.M

    Si les controls ont toujours une fenêtre parente, quelle sera la fenêtre parente d'un control que je créé comme ça :

    HWND hButton = CreateWindow ("BUTTON", "mon Button",
    WS_OVERLAPPED,
    10, 10, 100, 40, NULL, NULL,
    ghInstance, NULL);


    Et si ensuite je fais :
    SetParent(hButton,hwnd);
    Il change bien de fenêtre parente ?


    voilà un code un peu plus complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
        HWND hwnd;
        MSG msg;
        WNDCLASS wc;
    
        wc.style = 0;
        wc.lpfnWndProc = MainWndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = NULL;
        wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
        wc.lpszMenuName =  NULL;
        wc.lpszClassName = "MaWinClass";
    
        if(!RegisterClass(&wc)) return FALSE;
    
        hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW,
                                       CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
                                                       NULL, NULL, hinstance, NULL);
        if (!hwnd) return FALSE;
    
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
    
    	HWND hButton = CreateWindow ("BUTTON", "mon Button",
                                                WS_OVERLAPPED,
                                                10, 10, 100, 40, NULL, NULL,
                                                hinstance, NULL);
    
    	LONG lStyle = WS_VISIBLE | WS_CHILD;
    	SetWindowLong(hButton,GWL_STYLE,lStyle);
    	SetParent(hButton,hwnd);

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Je reformule mon problème :


    Contexte :

    Mon but est de faire un framework qui suive l'idée générale de .Net qui m'est familier.

    J'ai les classes W32Window et W32Button

    La classe W32Window possède une méthode statique W32Window::WindowProc de même que la classe W32Button possède une méthode W32Button::ButtonProc.

    Lorsque j'appelle le constructeur de W32Window (via un new) :
    - je référence la WNDCLASS W32Window si ce n'est pas déjà fait ( avec wc.lpfnWndProc = &W32Window::WindowProc )
    - j'appelle un CreateWindow( "W32Window",...) et je stocke le hwnd dans une variable privée de mon objet W32Window (this).
    - je stocke un pointeur vers this via SetWindowLong(GWL_USERDATA,(LONG) (this))

    Dans W32Window::WindowProc :
    - je récupère la fénêtre (objet W32Window) qui émet le message : p = (W32Window*) GetWindowLong(hwnd,GWL_USERDATA)
    - selon le message, j'appelle telle ou telle fonction de mon objet. (fonction OnQuit() pour le message WM_Destroy etc...)

    Ce système pour la fenêtre marche impeccablement bien.
    J'aimerai faire de même pour le button.
    1er soucis "button" est une WNDCLASS déjà écrite, je ne peux donc pas lui indiquer la méthode W32Button::ButtonProc de la même manière que pour la fenêtre. Je fais alors un SetWindowLong(GWL_WNDPROC,(LONG) &W32Button::ButtonProc) et là mon button ne s'affiche plus.

    J'ai essayé de faire dans W32Button::ButtonProc return CallWindowProc(&W32Window::WindowProc, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) mais celà ne fait rien.

    J'ai également essayé de stocker le résultat de SetWindowLong(GWL_WNDPROC,(LONG) &W32Button::ButtonProc) dans une variable WNDPROC mais j'ai rencontré des problèmes...


    Suis-je clair ? Voyez-vous le soucis ? Et une solution ?

    merci d'avance.

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Si les controls ont toujours une fenêtre parente, quelle sera la fenêtre parente d'un control que je créé comme ça :

    HWND hButton = CreateWindow ("BUTTON", "mon Button",
    WS_OVERLAPPED,
    10, 10, 100, 40, NULL, NULL,
    ghInstance, NULL);

    HWND hButton = CreateWindow ("BUTTON", "mon Button",
    WS_OVERLAPPED,
    10, 10, 100, 40, hwnd , NULL,
    ghInstance, NULL);

    avec le code donné dans le message #7.
    Tout est dans le MSDN regarder à CreateWindow.
    Pour les explications données en #8 je regarderai

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    relis bien le message 8. la réponse que tu me donne ne correspond pas à mon problème.

    Je sais que d'ordinaire, on utilise CreateWindow comme tu me le préconise. Mais dans mon cas je ne peux pas, car je créé un "Button" avec cette méthode mais dans le constructeur de ma classe W32Button. Je n'ai donc à ce moment là pas de hwnd à lui donner.

    Je ne peux associer les deux que lorsque j'appelle la methode Add() de W32Window : mafenetre.add(monbutton);

    Donc je DOIS passer par setparent(). Le probleme n'est pas la...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Donc, pour résumer:
    1. Indépendamment des problèmes de WindowProc, est-ce que l'ajout, ou le déplacement du bouton d'une fenêtre à l'autre (dont tu parlais dans un autre thread) marchent?
    2. Ensuite, le second problème est que tu veux avoir des boutons qui ont leur WindowProc personnelle sans passer par la fenêtre parent. Tu peux donc les subclasser ou les superclasser pour cela (Les bonnes manoeuvres pour le subclassing et le superclassing sont décrites ici: http://msdn2.microsoft.com/en-us/library/ms997565.aspx Tu peux te permettre d'utiliser une variable globale ou static pour la lpfnOldClassWndProc, puisque de base, tous les boutons ont la même WNDPROC).
      En théorie, tu peux utiliser GWL_USERDATA pour les boutons subclassés (mais tu ne pourras pas le réutiliser si tu subclasses la subclass). Si tu superclasses le bouton, le mieux est d'ajouter au cbWndExtra existant pour laisser GWL_USERDATA libre...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    oui merci ça marche en superclassant le button

Discussions similaires

  1. 3d dans un HWND Button ou autre
    Par yann458 dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/11/2011, 10h12
  2. Toolbar Buttons et paramètres
    Par Lux interior dans le forum XMLRAD
    Réponses: 4
    Dernier message: 13/06/2003, 19h44
  3. Hors série PCTEAM sur Direct 3D
    Par Shakram dans le forum DirectX
    Réponses: 1
    Dernier message: 12/10/2002, 16h34
  4. Quick Report et impression de données hors BDD
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 19/08/2002, 09h47
  5. [Kylix] Execution d'une application hors de l'edi
    Par Sadam Sivaller dans le forum EDI
    Réponses: 1
    Dernier message: 20/04/2002, 23h22

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