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 :

[winAPI] Pour hovers : peut-on affecter une région à un bouton (associé à une image)?


Sujet :

Windows

  1. #61
    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
    Moi, je serais du genre à faire un header commun pour toutes les classes et fonctions "Exportées" par la bibliothèque.

    Ce header commun devra se suffire à lui-même, c'est-à-dire n'inclure aucun header non-"standard" (même si la notion de "standard" peut être plus ou moins large).
    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.

  2. #62
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Tu veux dire que je devrais faire un header avec toutes les déclarations de classes que j'ai faites ? Mais une déclaration de classe, c'est comment ? "class MusicManager;" ? Bizarre... il doit quand même y avoir un moyen de récupérer un header tout fait, non ?
    Vive l'embarqué.

  3. #63
    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
    Non non, tu dois regrouper dans un header toutes les déclarations complètes des classes disponibles pour l'utilisateur. Il faut qu'inclure ce header suffise pour l'utilisateur.
    Dans ce cas, tu n'as plus qu'à fournir la bibliothèque compilée accompagnée du header, et hop c'est utilisable...
    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.

  4. #64
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Pas bête... je viens de me rappeler que plusieurs bibliothèqies connues comme fmod ou le GUI : QT utilisent une bibliothèque, inclue par plusieurs headers représentant chaque module. Résultat, même si j'ai plusieurs headers composant ma bibliothèque je peux quand même les passer tels quels, et ils seront inclus en fonction des besoins.

    Bref, je suis en train de faire la structure du programme, c'est à dire la déclaration des classes etc. selon la philosophie C++. (Player hérite de Window, et Button de Component etc.) Quand j'aurais fini, je ferais un test avec la classe Button sur une fenêtre vierge pour tester le coup des masques.
    Vive l'embarqué.

  5. #65
    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
    Finalement, ça fait un moment...
    Où en es-tu ? As-tu réussi une interface sympa ?
    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. #66
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    En fait j'ai eu beaucoup de boulot... et puis je me suis mis à Linux. Mais je ne vais pas abandonner pour autant :p

    Alors : j'ai fini la bilbiothèque audio, elle marche (il y a pas mal de temps, quand même). Je me suis mis à faire l'organisation du code, mais sans tests comme quoi ça marche, je ne risque pas d'y arriver.
    J'ai donc commencé aujourd'hui le code. Le problème, c'est que c'est (encore) un peu flou.

    J'ai fait 3 bitmaps de test, mais ils sont un peu différent (des différences très peu notables [de l'ordre d'un pixel], mais je me demande si ça aura une implication...). Bon. Pas grave, je récapitule donc le (pseudo-)code:

    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
    #include "Button.h"
    
    Button::Button(
                    HBITMAP skins[3], 
                    RECT dimensions, 
                    Window *parent
                  ) : _dimensions(dimensions), _parent(parent)
    {
          HDC temp = GetDC(_parent->_hwnd); /*Objet Window ayant un membre HWND*/
          for(int i = 0 ; i < 3 ; i++)
          {
              _skins[i] = CreateCompatibleDC(temp);
              SelectObject(_skins[i], skins[i]);
          }
          ReleaseDC(temp);
          temp = NULL;
    }
    Seulement, j'ai encore du mal avec les masques... dois-je plutôt utiliser SRCOR pour pouvoir obtenir un masque monochromatique à partir du bitmap, et le stocker dans un DC correspondant ?

    Je sais que l'on a déjà dit que c'était mieux de le faire à part (moins compliqué), mais est-ce qu'une légère modification aura un impact ? Et puis, la conversion monochrome, je ne la trouve pas...

    Si ça peut aider à expliquer, j'upload les skins de test.
    Images attachées Images attachées    
    Vive l'embarqué.

  7. #67
    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
    On sait que le masque doit être monochrome (blanc sur fond noir dans ton cas, avec un OR (c'est SRCPAINT qui le fait), donc si tu n'as rien pour le générer automatiquement, autant le fournir à part...
    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.

  8. #68
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Justement : si je "veux" le générer automatiquement, est-ce que ça complique considérablement le code ?
    Vive l'embarqué.

  9. #69
    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
    Ben, tu utilises la méthode vur sur le lien: Tu crées une image monochrome, tu lui choisis comme couleur d'arrière-plan la couleur que tu veux rendre transparente, tu fais un BitBlt(), puis tu re-changes la palette pour avoir du blanc sur fond noir...
    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.

  10. #70
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Je viens de chercher un peu plus loin (en fait, plus près ), et je me rends compte que j'ai raté le lien que tu m'avais passé... cette fonction m'est très utile, je vais pouvoir l'utiliser dans mon code.

    Cependant, je ne vois pas comment je pourrais faire pour parfaitement intégrer les boutons à leurs logements respectifs...

    Tu comprends, c'est un véritable graphiste qui m'a fait les skins, et il m'a proposé de présenter le programme une fois fini sur son site, donc il ne faut pas que je le rate

    Je sais qu'avec la fonction tel-quel, je pourrais, mais cela serait du bricolage, puisqu'il faudrait réaliser des tests permanents pour régler les coordonnées du bouton afin qu'il coïncide parfaitement avec le logement.

    Enfin, s'il n'y a pas moyen, je serais bien forcé de faire comme ceci...

    Au fait, une fois ce problème réglé, je n'aurais qu'à faire un bitmap avec des zones de couleur unique (et unies) pour chacun des boutons, et le fond, afin de faire un GetPixel() pour récupérer la position de la souris, c'est ça ? (par ceci, j'entends, "et c'est fini ?" )
    Vive l'embarqué.

  11. #71
    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
    C'est ça.
    Et pour générer ces fameuses zones de couleur, tu peux justement utiliser les masques...
    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. #72
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Hmm... là ça sera trop long. Tant pis, j'ai choisi d'utiliser la fonction (adaptée à mon code) de Microsoft, afin d'afficher les boutons à une certaine coordonnée (ceux qui feront les skins -sûrement moi, donc autant faire ça ^^- se débrouilleront pour avoir des coordonnées correctes, je ne vais pas le ralentir pour quelque chose d'aussi futile...) et un masque de souris se trouvera aussi dans la dll graphique : il sera obtenu sous paint, tout bêtement à partir du skin principal.

    Je vais m'occuper de ça De longs tests sont à venir (et puis, je dois surtout découper les boutons proprement...)

    Je te tiens au courant. Merci encore
    Vive l'embarqué.

  13. #73
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Euh... je rencontre un petit problème... ça avance bien, je suis en train de mettre au point le programme de test d'un bouton hover, mais durant le procédure principale (tu te rappelles, pour la placer dans la classe, je devais la déclarer "static"), j'aurais besoin d'accéder à un des membres privés de la classe. Je sais que des fonctions statiques ne peuvent qu'accéder à des membres statiques, mais quand je déclare les membres statiques, j'ai une erreur de compilo
    .objs\Window.o:Window.cpp.text+0x26d): undefined reference to `Window::_button'
    Et ce, lors de l'accès normal dans le constructeur. Bref, c'est soit l'un, soit l'autre. Comment faire pour contenter les deux ?

    Tiens pendant que j'y suis... pour ma listbox servant de playlist, j'ai pensé la faire en ownerdraw pour pouvoir colorer les items selon leur état (normal - en lecture - corrompu) (et pourquoi pas mettre des icônes, on verra), et aussi pour la rendre transparente. Est-ce que, par défaut, elle l'est, ou alors il faut exécuter du code supplémentaire pour pouvoir la rendre transparente ?

    Merci

    Edit : Mince, je voulais éditer...
    Vive l'embarqué.

  14. #74
    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
    Pour utiliser les données de la classe, j'avais expliqué le truc: Tu passes le pointeur vers l'objet dans le CreateWindow(), et dans WM_CREATE, tu le mémorises avec SetWindowLong().
    Et pour les autres messages, il te suffit de récupérer le pointeur avec GetWindowLong(), et hop!
    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.

  15. #75
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    D'accord. Mais l'index à utiliser, pour Set/GetWindowLong, cela serait plutôt GWL_USERDATA ou DW_USER ?

    Sinon, cela donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    _hwnd = CreateWindow(..., (LPARAM)this);
    
    //Stockage du pointeur de l'instance dans l'index GWL_DATA de la fenêtre :
    WM_COMMAND:
          SetWindowLong(hwnd, GWL_USERDATA, (LONG)lParam);
    
    //Appel de la méthode du membre _button "setState" :
    GetWindowLong(hwnd, GWL_USERDATA)->_button->setState(OVER_STATE);
    Vive l'embarqué.

  16. #76
    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
    GWL_USERDATA pour une fenêtre, DWL_USER pour une boîte de dialogue.

    L'autre solution, c'est de mettre une valeur non-nulle au membre cbWndExtra de la WNDCLASS (par exemple, tu y mets la taille d'un pointeur) et tu utilises 0 comme index...
    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.

  17. #77
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Je préfère utiliser GWL_USERDATA, c'est plus naturel. Sinon, le code te parrais correct ?

    Edit: Je suppose que l'on ne peut pas accéder aux membres privés de la classe ?
    Vive l'embarqué.

  18. #78
    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
    Eh bien... Tu auras besoin d'un cast, mais ça m'a l'air à peu près OK...
    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.

  19. #79
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    D'accord. Dans ce cas là, je vérifierais quand mon clavier arrêtera de déconner. (c'est frustrant )

    Merci encore.

    P.S: Tiens au fait, une idée conçernant la listbox transparente ownerdraw précisée un peu plus haut ?
    Vive l'embarqué.

  20. #80
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Allons bon : j'ai des problèmes avec le graphiste s'occupant des skins : il refuse de découper le skin (il a gardé le psd) pour récupérer une image par bouton... il m'a parlé des png. Effectivement, cela pourrait être une idée pour la transparence. Est-ce que ça changerait beaucoup au code ? Le simplifirait-il ? Peut-on obtenir une région à partir d'une image png ?

    Merci d'avance.

    En tout cas, j'ai fini le test d'un bouton hover. Il ne me reste plus qu'à élaborer un masque de souris pour celui-ci, et à l'implémenter pour finir le test. Après, je m'attaquerais au test de la playlist (il me faut une playlist avec certains items colorés, et étant transparente), et enfin au code complet.

    En ce qui conçerne cette listbox, peux-tu répondre à ma question ci-dessus ? Merci.
    Vive l'embarqué.

Discussions similaires

  1. Associer une action à un bouton dans une JDialog
    Par moomba dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 07/12/2008, 20h08
  2. Réponses: 14
    Dernier message: 11/08/2008, 22h28
  3. Réponses: 1
    Dernier message: 18/06/2008, 09h32
  4. affecter une macro à un bouton dans une feuille
    Par gu000 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/10/2007, 14h04
  5. Réponses: 3
    Dernier message: 17/08/2006, 11h30

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