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. #1
    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 [winAPI] Pour hovers : peut-on affecter une région à un bouton (associé à une image)?
    Bonjour,

    J'ai décidé de refaire une refonte complète de mon lecteur mp3 en C++. ([edit] je précise, sans MFC puisque je ne le maîtrise pas du tout, et parce qu'on m'a dit que c'était amené à disparaître...) Seulement, je voudrais, afin de pouvoir créer des hovers (vous savez l'effet d'éclairage quand on passe sur un bouton, et d'enfoncement quand on le clique), appliquer une région à un bouton.

    Je m'explique : Je compte créer ma fenêtre avec comme image le fond, sans boutons, et créer des classes "button" avec trois images affectées au state, et les blitter en conséquence. Seulement, j'aimerais faire une méthode déterminant si la souris est dessus. OR, mes boutons ne sont pas rectangulaires. Donc je voudrais savoir si c'était possible de leur affecter une région, d'une part pour rendre transparent (voir le fond autour) les parties n'étant pas réellement le bouton, mais surtout pour que la souris ne soit détectée sur le fond, que quand elle passe sur la couleur transparente du bouton, et sur le bouton quand elle est sur la partie visible, et ce pour pouvoir changer son état.

    Le seul problème, c'est que je doute que cela marche... avez vous une meilleure idée ?

    Merci d'avance.

    P.S: Je sais que je poste souvent pour mes différents problèmes, mais avouez que la plupart du temps ils ne sont pas faciles à résoudre J'ai besoin d'aide de pros
    Vive l'embarqué.

  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 518
    Points
    41 518
    Par défaut
    Mon idée: Tu fais des images "masques" monochromes qui ne sont pas affichées, mais testées pour chaque bouton.

    Ainsi, pour détecter un clic/hover, tu détectes d'abord si le pointeur de souris est dans l'image masque:
    • Si non, tu es sûr que la souris n'est pas sur le bouton
    • Si oui, tu fais un GetPixel() sur l'image masque, et selon la couleur, tu sauras si la souris est sur le bouton ou non...
    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 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
    Hem oui pourquoi pas... si seulement je savais comment faire
    Vive l'embarqué.

  4. #4
    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 518
    Points
    41 518
    Par défaut
    Qu'est-ce que tu ne sais pas comment faire ?

    Tu as des boutons virtuels si j'ai bien compris, donc ce doit être directement la boîte de dialogue qui gère les WM_MOUSEMOVE.
    Si tu ne veux pas tester la position d'un rectangle, tu fais des masques aussi grands que l'image de fond
    Chaque masque doit avoir un DC, ou bien tu fais un DC pour tous et des SelectObject() au fur et à mesure.
    Et ensuite, un GetPixel() suffit sur chaque masque pour savoir si le curseur est sur un pixel "bouton" ou un pixel "vide"...

    Pose des questions plus spécifiques s'il y a quelque chose que tu ne comprends pas...
    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.

  5. #5
    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
    C'est surtout la notion de masque que je ne comprends pas... tu veux dire que pour chaque bouton, je dois créer un membre de la classe button étant un masque des dimensions du fond ? Non là j'avoue que je suis un peu largué... Déjà la création de masques m'est incunnue (ou alors je le faisais sans en savoir le terme, puisque j'ai du mal à faire la correspondance entre un bitmap et un masque... mes notions conçernant ce sujet sont assez limitées.)
    Vive l'embarqué.

  6. #6
    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 518
    Points
    41 518
    Par défaut
    Tiens, voilà ce qu'est un masque (quand on sait ce qu'on cherche, google peut se révéler utile en fin de compte) :
    http://glasnost.itcarlow.ie/~powerk/...gdi_index.html
    Ici, il est utilisé pour la transparence. Nous, nous allons l'utiliser "pour la collision" : Tu n'auras pas à afficher le masque, mais tu l'utiliseras en interne pour savoir si le clic a eu lieu sur un point noir du masque ou sur un point blanc...
    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.

  7. #7
    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
    Très intéressant le contenu du site (j'ai juste survolé pour le moment). Je vais m'y pencher d'un peu plus près d'ici peu

    Penses tu que cela soit facilement imbricable dans la classe ?
    Vive l'embarqué.

  8. #8
    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 518
    Points
    41 518
    Par défaut
    Aucune idée, je ne suis pas vraiment fort en conception.
    Mais tu devrais pouvoir faire une classe WindowlessButton ou un truc du genre...
    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.

  9. #9
    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
    Que veux tu dire par WindowLessButton ?
    Vive l'embarqué.

  10. #10
    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 518
    Points
    41 518
    Par défaut
    Ce sont bien des boutons qui n'ont pas de HWND propre que tu cherches à faire, non?
    Des boutons qui ne sont qu'une forme sur la fenêtre qui les contient...



    Ou sinon, tu peux faire des vrais boutons standard, en les subclassant pour redéfinir les traitements de WM_PAINT et WM_NCHITTEST...
    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.

  11. #11
    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
    Oui oui c'est bien ça. Des boutons "faits main". Ce n'est en rien compliqué à coder, excepté ce problème...
    Vive l'embarqué.

  12. #12
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    J'ai fais un prog y'a un temps pour déterminer graphiquement des régions pour des boutons virtuels.
    Ensuite c'est enregistré en tant que ressource dans le prog, et chargé.
    Après c'est du traitement ...
    L'exemple est fait en delphi sans VCL donc transposable en C++ facilement (API win).
    Quand mon site refonctionnera (profil), tu pourra y jeter un oeil si t'es intéressé ..
    .: La cosse : il n'y a que ça de vrai :.

  13. #13
    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ésolé je n'avais pas vu la réponse... effectivement, c'est réellement ce que je cherche à faire : appliquer une région à un bitmap qui sera collé en fonction de son état sur le skin premier.

    [En principe, le lien donné par Médinoc traite de ceci, en C(++), et en code. J'irai y jeter un oeil.]
    Vive l'embarqué.

  14. #14
    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
    J'ai une question pour l'intégration des hovers... supposons que j'ai un skin sans bouton, avec -au lieu des boutons- des surfaces de couleur unie représentant chacun des boutons. Si j'ai des boutons à part, avec un fond de la couleur de la surface sur laquelle je veux les coller (avec le masque AND)... est-ce que je peux directement appliquer le masque AND avec les deux images (skin + chacun des boutons) ?

    Et sinon, vu que la correspondance des pixels n'est pas très précise (c'est avec paint dot net) , comment pourrais-je appliquer des masques pour obtenir des images adaptées (il me semble que je dois obtenir un masque à partir du skin du bouton, appliquer ce masque sur le skin général avec OR (à une position donnée), et ensuite le coller avec l'opération AND) ?

    Auriez vous une méthode pour ceci ?

    Merci d'avance.

    P.S: Des images d'exemple sont uploadées pour ce post.
    Images attachées Images attachées     
    Vive l'embarqué.

  15. #15
    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 518
    Points
    41 518
    Par défaut
    Visiblement, t'as pas compris ce que je voulais dire.
    Les images de couleurs unies ne sont pas supposées être visibles en aucune façon: Elles font partie du "masque de souris" de l'arrière-plan...


    La partie masque "Graphique", par contre, utilise les opérateurs OU et ET:
    http://en.wikipedia.org/wiki/Bit_blit


    Note: Tu peux utiliser le même masque "de bouton" pour appliquer sur le "masque de souris" et sur l'image affichée pour un bouton donné.
    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.

  16. #16
    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
    Note: Tu peux utiliser le même masque "de bouton" pour appliquer sur le "masque de souris" et sur l'image affichée pour un bouton donné.
    Si, justement c'est ce que j'ai voulu faire. En fait, ce skin principal servirait à récupérer le pixel correspondant au lParam du WM_NCHITTEST pour déterminer l'appartenance du curseur à l'un ou l'autre bouton (ou au vide), mais aussi à pouvoir coller les skins des boutons sur le skin principal avec l'opération AND.

    Sinon, les opérations s'effectuent avec quoi ? BitBlt ? Comment affecter un masque à une image (le OR, pour la correspondance skin bouton/skin principal) sans forcément passer par du code ?

    Merci d'avance.
    Vive l'embarqué.

  17. #17
    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 518
    Points
    41 518
    Par défaut
    Le dernier paramètre de BitBlt() permet de faire ce qu'on veut: OR, AND, copie de base...

    Et le masque du bouton peut très bien être monochrome et noir-sur-blanc comme indiqué sur wikipédia. Pour appliquer une "couleur unique" sur le "masque de clic", tu peux générer dynamiquement un "sprite" de cette "couleur unique":
    • Tu crées une image à part, contenant uniquement la couleur unique.
    • Tu fais un Bitblt() avec le masque sur cette image et un paramètre qui signifie "AND NOT masque" (ce n'est pas un opérateur listé dans l'aide, mais d'après cette page, c'est la valeur 0x00220326 ("DSna", ce qui veut bien dire "Destionation AND NOT source"))

    Là, tu as un sprite de la forme du bouton et de la "couleur unique", donc tu n'as plus qu'à l'afficher sur le "masque de clic" de la même manière qu'un autre sprite...
    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.

  18. #18
    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 suis largué, là... ne puis-je pas faire comme je voulais ? L'utilisation du monochrome engendrerait un conflit au niveau du collage, et aussi du survol de la souris entre les boutons, non ? Il faut donc une couleur unique pour chacun...

    Or, c'est ce que j'ai fait dans le skin donné : celui-ci sert pour la souris, et le collage des boutons (ils ne sont pas directement collés sur celui-ci, mais dans un DC, donc pas de problème).
    Vive l'embarqué.

  19. #19
    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 518
    Points
    41 518
    Par défaut
    Le masque d'un sprite DOIT être noir sur blanc (si le sprite est sur fond noir), ou à la rigueur, blanc sur noir (si le sprite est lui-même sur fond blanc).
    Cela ne peut PAS marcher avec d'autres couleurs, puisque le noir est #000000 et le blanc #FFFFFF.

    Donc, autant que le masque soit enregistré en monochrome, histoire de supprimer toute idée de tenter de faire autrement (même si avoir le masque en CompatibleBitmap au lieu de Monochrome peut être une bonne idée au niveau vitesse).


    Donc, la "couleur unique" doit être générée à l'exécution, et le bitmap affiché n'a aucune raison de la connaitre: La "couleur unique" ne sert qu'au "masque de souris".

    PS: Je précise pour éviter toute ambiguité: Tes boutons WindowLess sont des sprites.
    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.

  20. #20
    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
    Hem c'est ce que je redoutais... comment puis-je faire alors ? Les boutons ne sont alors plus différenciés au collage, non ?

    Serait-il possible que tu me donnes les étapes à respecter ?

    Merci d'avance.
    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, 21h08
  2. Réponses: 14
    Dernier message: 11/08/2008, 23h28
  3. Réponses: 1
    Dernier message: 18/06/2008, 10h32
  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, 15h04
  5. Réponses: 3
    Dernier message: 17/08/2006, 12h30

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