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. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    OK pour les étapes nécessaires:
    1. On suppose que la fenêtre est représentée par une classe C++, et le les boutons WindowLess aussi.
    2. On suppose aussi que les boutons ne possèdent qu'un seul masque: Toute zone non-transparente du bouton est également zone cliquable du bouton, et vice-versa.

    À la création d'une fenêtre contenant des boutons WindowLess (on la supposera non-redimensionnable pour commencer).
    • Création du bitmap "masque de souris" : Une image Couleur, avec le fond de la couleur que tu veux (mais on doit savoir que cette couleur est celle du fond)
    • Création/Chargement du bitmap d'arrière-plan affiché
    • Création d'une map couleur --> bouton.


    À la création d'un bouton WindowLess:
    • Création/Chargement du bitmap "Image" et du bitmap "Masque" du bouton.
    • Affectation d'une couleur (typiquement, on appelle une fonction de la classe de la fenêtre, qui ajoute bouton et couleur à la map).
    • Création du sprite "de souris" à partir de la couleur et du masque.
    • Dessin du sprite "de souris" sur le bitmap "masque de souris" de la fenêtre



    Et lors du traitement de WM_PAINT, on affiche simplement l'image d'arrière-plan de la fenêtre, puis le sprite graphique de chaque bouton WindowLess.
    Lors du WM_NCHITTEST, ou du clic, ou de tout ce que tu veux avec la souris, on fait un GetPixel() sur le "masque de souris" de la fenêtre et on obtient ainsi une couleur. On utilise la map pour obtenir le bouton correspondant à cette couleur, et paf! ça fait des chocapic!
    (plus sérieusement, et hop, on sait sur quel contrôle se trouve le pointeur de souris).


    Ainsi, avec trois contrôles, on aura un truc du genre de l'image que j'avais uploadée il n'y a pas si longtemps: Coté visible, les images graphiques de la boîte de dialogue et des boutons, coté invisible, le bitmap "masque de souris" avec les trois masques des boutons, chacun de sa couleur.
    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. #22
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ensuite, si tu veux faire des boutons dont la zone cliquable est différente de la zone transparente, aucun problème: Simplement, il te faut utiliser deux masques au lieu d'un.


    Et si tu veux faire une fenêtre redimensionnable, tu dois, à chaque redimensionnement:
    • détruire le bitmap "masque de souris" de la fenêtre
    • En créer un nouveau avec les nouvelles dimensions
    • Redessiner le sprite "de souris" de chaque bouton dessus.
    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. #23
    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
    Merci beaucoup. Par contre, je ne comprends pas certains points :

    Création d'une map couleur --> bouton.
    D'où sort cette map ? Sous quelle forme se présente-t-elle ? (en fait, je ne vois pas ce que c'est [et que signifie --> bouton :p ])

    Création/Chargement du bitmap "Image" et du bitmap "Masque" du bouton.
    Mais le bitmap "Image" se présente sous la forme de l'image du bouton sur fond de la couleur conçernée : alors qu'est ce que le bitmap "Masque" du bouton ?

    Sinon, tu veux dire que le masque de la souris est d'abord vide, puis rempli par le biais des boutons ? Ne serait-t-il pas plus facile de fournir directement un bitmap contenant les surfaces colorées ?

    Je souhaiterais ne pas avoir besoin de coordonnées/dimensions... c'est à dire, tout faire en fonction des bitmaps fournis (ceci afin de fournir plusieurs skins possibles sans pour autant changer le code). Es-tu sûr que c'est fait ici ?
    Vive l'embarqué.

  4. #24
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    map couleur --> bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map< COLORREF, CMonBoutonWindowLess * >
    Le bitmap "Image", ce doit être l'image du bouton sur fond noir ou blanc.
    Exemple: Un bouton PacMan, ou un bouton Fantôme, ou un bouton si tu en as envie...
    (à gauche sur l'image)

    Le bitmap "Masque", c'est le même en noir sur blanc ou en blanc sur noir:
    (à droite sur l'image)

    http://en.wikipedia.org/wiki/Image:Blit_dot.gif



    Et oui, le "masque de souris" est initialement vide, et rempli lors de la création des boutons. C'est beaucoup plus simple à gérer que de fournir directement un bitmap pré-rempli: Si tu déplaces tes boutons, tu n'auras pas à modifier le bitmap...


    Et pour ta dernière question, ça dépend:
    • Tous les bitmaps des skins sont modifiables sans changer le code
    • Par contre, les bitmaps ne disent pas où doivent être créés les boutons. Si tu veux que ce soit paramètrable, il te faudra rajouter un fichier en plus pour tes skins (genre un petit fichier texte) ou , si tu regroupes tout dans un grand bitmap, coder l'information dans le bitmap (ce qui est possible aussi)
    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. #25
    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
    Et donc, j'aurais besoin des coordonnées... ce que je voulais, c'était m'éviter des réglages en fonction des coordonnées, d'autant plus que j'ai des problèmes avec celles-ci. j'ai l'impression que le système métrique diffère entre les ressources et le reste et paint dot net... en tout cas, j'ai toujours dû régler avec une cinquantaine d'essais. C'est ce que je voulais éviter.

    Mais si j'en ai absolument besoin, je ferais une méthode en dll contenant la classe Button retournant ses coordonnées/dimensions. Tiens, au fait : est-ce que l'on peut instancier un objet déclaré dans une dll ? Si oui, comment ?

    Pour le sujet, je sais assez de théorique. (c'est assez flou pour moi, mais il faut bien que je m'y fasse) Pour le reste, j'attendrais de vraiment m'y plonger, (et dès que j'aurais les skins terminés) afin de fournir des problèmes précis.
    Vive l'embarqué.

  6. #26
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu n'as pas "besoin" des coordonnées des boutons pour la souris.
    Tu en as simplement besoin pour savoir où mettre les sprites (ce qui est normal)...
    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. #27
    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, après réflexion...en fait, avant je pensais qu'il suffisait de faire des surfaces de la couleur du fond du bouton avec lequel on va effectuer le collage pour pouvoir, à travers le masque AND, les coller sans avoir besoin des coordonnées... stupid, isn't it ?

    Saurais-tu me répondre pour la question d'objet dll instancié ?
    Vive l'embarqué.

  8. #28
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Eh bien, ça dépend comment est la DLL.
    Pour une DLL en C++ qui expose directement une classe, il y a plusieurs problèmes:
    • Il y a des restrictions si la DLL expose publiquement des objets de la STL (Conteneurs, strings, etc.) : Moi-même, j'ai préféré renoncer et garder tous mes conteneurs en private
    • Et que tu exposes la STL ou non, il faut savoir que l'interface C++ dépend du compilateur: Une DLL C++ compilée sous Visual ne peut pas être utilisée avec Dev-C++ (par contre, les fonctions C ou extern"C" peuvent l'être).

    Comme je l'ai dit, je n'ai pas trouvé comment contourner le premier problème: La meilleur solution pour moi, c'est de n'utiliser la STL qu'en interne.
    Si le second problème ne te gène pas, alors il n'y a aucun problème pour utiliser ta classe: Il te suffit de la déclarer en dllexport, de lier le programme utilisateur à l'import library, et tu peux créer un objet de ta classe comme si elle venait du programme lui-même.
    Si le second problème te gène, il va falloir passer par des fonctions extern "C" qui créent les objets, et des interfaces (un peu comme le fait COM/OLE).
    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. #29
    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. Je vais donc attendre les skins pour m'attaquer à la question

    Merci de ta patience
    Vive l'embarqué.

  10. #30
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par kidpaddle2
    Bonjour,

    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
    Désolé pour le hors sujet mais l'éditeur n'a jamais parlé d'arrêter le soutien de ces classes..
    si MFC disparait win32 aussi....

  11. #31
    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 cru lire que MFC était trop "vieux" (le C date pourtant de 30 ans, quand même ^^), et remplacé par le dot net... bizarre, je pensais que le dot net était en C#. Enfin bon, c'est pas mon rayon.

    Au fait, ça pourrait être intéressant d'apprendre le MFC ? (Etant donné que j'adore le C++) Si oui, connais tu des bons cours ?
    Vive l'embarqué.

  12. #32
    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 trouvé un exemple de bouton bitmap... celui-ci utilise les méthodes de subclassing et semble marcher.

    Serait-il adaptable à mon cas ?

    Voici le 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    //Code complet, environ 80 lignes de code:
    
    
    
    #include <windows.h>
    
    
    
    HINSTANCE hInst; // Instance application
    
    BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); 
    
    
    
    //Couleur de fond de la feuille
    
    HDC hDC;
    
    HBRUSH couleur_fond; //brush à la couleur RGB
    
    
    
    // Bouttton bitmap
    
    HWND hBtn;          // Handle du boutton bitmap (contrôle)
    
    HBITMAP hBitmap;    // handle du bitmap         (image)
    
    WNDPROC OldBtnProc; // Déclaration proto fonction subclassing boutton
    
    BOOL ButtonIsOver;  // TRUE quand souris est dessus
    
    
    
    
    
    /* -----------------------------------------------------------------------------
    
       Point d'entrée
    
    ------------------------------------------------------------------------------*/
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    
        hInst=hInstance; //on met de côté le handle de l' appli
    
    	return DialogBoxParam(hInstance, (char*)100, 0, &DlgProc, 0);
    
    }
    
    
    
    /* -----------------------------------------------------------------------------
    
       Procédure de sous-classement du boutton
    
    ------------------------------------------------------------------------------*/
    
    LRESULT CALLBACK BtnProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    
    {
    
        switch(message){
    
          case WM_LBUTTONDOWN: // on clique: charge bitmap "cliqué"
    
                 hBitmap=LoadImage(hInst,(LPCSTR)"imgdown",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
    
                 SendMessage(hBtn,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)(HBITMAP)hBitmap);        
    
                 return TRUE;
    
          case WM_LBUTTONUP:
    
                 hBitmap=LoadImage(hInst,(LPCSTR)"imgnorm",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
    
                 SendMessage(hBtn,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)(HBITMAP)hBitmap);
    
                 PostQuitMessage(0); //fermeture!
    
                 return TRUE;
    
          case WM_MOUSEMOVE:
    
                 hBitmap=LoadImage(hInst,(LPCSTR)"imgover",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
    
                 SendMessage(hBtn,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)(HBITMAP)hBitmap);        
    
                 ButtonIsOver=TRUE;
    
                 return TRUE;
    
       }
    
        // et retour à la procédure originale
    
        return CallWindowProc(OldBtnProc, hWnd, message, wParam, lParam);
    
    }
    
    
    
    /* -----------------------------------------------------------------------------
    
       Callback fenêtre
    
    ------------------------------------------------------------------------------*/
    
    BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    
        int x,y;
    
    	switch (uMsg){
    
    
    
    	  case WM_INITDIALOG:
    
                // définit variables fenêtre
    
                   couleur_fond = CreateSolidBrush(RGB(148,183,197)); // bleu foncé
    
                   SetWindowText(hWnd, "Boutton Bitmap"); //titre taskbar
    
    		    // centre la fenêtre
    
                   x = (GetSystemMetrics(SM_CXSCREEN)-200)/2;
    
                   y = (GetSystemMetrics(SM_CYSCREEN)-200)/2;
    
                   MoveWindow(hWnd,x,y,200,160,0);
    
                // subclassing du boutton: appel de la fonction de sous-classement
    
                hBtn = GetDlgItem(hWnd, 101); //met de côté le handle
    
                OldBtnProc=(WNDPROC) SetWindowLong(hBtn,GWL_WNDPROC,(LPARAM)BtnProc);
    
    		    break;
    
    
    
          case WM_MOUSEMOVE:
    
               if (ButtonIsOver){
    
                 hBitmap=LoadImage(hInst,(LPCSTR)"imgnorm",IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
    
                 SendMessage(hBtn,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)(HBITMAP)hBitmap);        
    
                 ButtonIsOver=FALSE;
    
                 return TRUE;
    
               } break;
    
    
    
    	  case WM_CTLCOLORDLG:return(LRESULT)couleur_fond;
    
    
    
          case WM_CTLCOLORSTATIC:
    
     			hDC = (HDC)wParam;
    
    		    SetBkMode(hDC, TRANSPARENT);
    
                SetTextColor (hDC, RGB(215,236,253));//bleu clair
    
                return(LRESULT)couleur_fond;
    
    
    
    	  case WM_CLOSE:
    
                DeleteObject(hBitmap);
    
    		    DeleteObject(couleur_fond);
    
    		    DeleteObject(hDC);            
    
    		    EndDialog(hWnd,0);
    
    	}
    
    	return 0;
    
    }
    Par contre, j'ai remarqué beaucoup de redondance et pas mal d'erreur de code... le trouves-tu correct ?

    Si c'est le cas, cela serait tout simplement parfait, puisque à ce moment là, j'aurais juste à l'adapter à une classe dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Button
    {
       public:
          Button(HINSTANCE, HWND);
          ~Button();
    
       private:
          BOOL isMouseOver();
          int getState();
    
          void setState(int); //Différents bitmaps
    
          HBITMAP _skin[3];
    };
    Merci d'avance.
    Vive l'embarqué.

  13. #33
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Là, ce n'est plus du WindowLess : Chaque bouton est associé à une fenêtre.

    Je pense que garder nos boutons WindowLess est plus avantageux, car cela nous permet d'avoir vraiment des boutons de n'importe quelle forme, et même des boutons qui s'entrelaçent.
    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.

  14. #34
    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
    Peut être, mais c'est plus simple... j'avoue avoir du mal avec les masques. Serait il possible que tu me fasse un exemple de code pour un seul bouton ?

    Merci d'avance
    Vive l'embarqué.

  15. #35
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je peux toujours essayer, mais je ne sais pas quand j'aurais le temps...

    En attendant, tu peux essayer par "étapes" : Pour l'instant, ne te soucies pas du "Masque de souris", et essaie simplement de faire des sprites:
    L'initialisation:
    • Quelques LoadImage() pour charger le bitmap du bouton et son masque
    • Un GetDC(), deux CreateCompatibleDC(), un ReleaseDC() pour créer les DC en mémoire qui contiendront les deux bitmaps du sprite
    • 2 * SelectObject() pour mettre les bitmaps dans les DC

    Pour l'affichage:
    Deux BitBlt() avec les bons Raster operation codes (je pense que SRCAND et SRCPAINT te suffiront, mais si ce n'est pas le cas, il faudra voir dans la liste complète).
    Comme indiqué sur la page Wikipédia, ça dépend du format des bitmaps et de leurs masques:
    • Si le bitmap est sur fond blanc, le masque doit être blanc sur noir. Il faut d'abord faire un OR du masque pour mettre la silhouette en blanc, puis un AND du sprite pour y mettre les couleurs.
    • Si le sprite est sur fond noir, le masque doit être en noir sur blanc. Il faut d'abord faire un AND du masque pour mettre la silhouette en noir, puis faire un OR du sprite pour y mettre la couleur.


    Quand tu auras réussi à afficher un sprite, on pourra s'intéresser au "masque de souris" : On "dessinera" le masque du bouton sur le bitmap du "masque de souris" un peu à la manière 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.

  16. #36
    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. Sinon, pour les masques obtenus à partir des sprites : je les fais à part, ou dans le programme ? Dans le programme, il faut utiliser BitBlt avec SRCOR, mais en dehors, comment faire ?
    Vive l'embarqué.

  17. #37
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Les masques, tu les fais à part.
    Au pire, tu ouvres paint ou un logiciel de dessin plus évolué, et tu convertis l'image en monochrome SANS tramage, ou un truc du genre...


    Il existe aussi un moyen de générer un masque en Win32 à partir d'une image et d'une couleur qu'on décrèterait "LA couleur transparente" (façon image GIF) mais c'est trop compliqué pour l'instant... (ça implique des conversions de l'image en monochrome etc., la méthode est décrite à l'étape 5 de cet article, référencé par l'aide de TransparentBlt())

    Note: Cet article est intéressant, mais nous n'allons pas utiliser la fonction complète, d'une part parce qu'elle fait tout à chaque fois, d'autre part parce qu'on aura besoin du masque par le suite.
    Et aussi, je pense qu'il est mieux d'avoir le masque à part, car ainsi la transparence ne dépend plus des couleurs.
    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. #38
    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. Je me mettras au travail quand je récupérerais les skins finaux (qui sont normalement en train d'être conçus).

    Sinon, j'aurais une question hors sujet : comment afficher une infobulle à partir d'une Tray Icon ? Car la définition du membre du tooltip n'a pour effet que de s'afficher dès que l'application est mionimisée, et c'est tout. Ah, aussi : comment faire une action différente selon si un simple clic ou un double clic a été effectué (toujours sur la tray icon) ? En effet, si on double clique, le premier clic est reçu d'abord (logique), et c'est la première action qui est effectuée...

    P.S: Pour précision, je te demande ça car j'ai fait un cours de WinAPI sur un site, et j'aimerais passer à un chapitre sur la trayicon. Mais si je n'y arrive pas moi-même...
    Vive l'embarqué.

  19. #39
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    <Réponse à la question hors sujet>

    Pour un infobulle normale, on utilise le champ szTip de la structure NOTIFYICONDATA.
    (Par opposition aux champs szInfo et szInfoTitle, qui servent aux "Balloon Tip").

    Pour le double-clic, je ne sais pas. Je suppose que tu peux essayer de tester avec un timer:
    Le premier clic règle un flag et lance le timer avec SetTimer().
    Le second clic (déterminé par le flag) supprime le timer avec KillTimer(), retire le flag et effectue l'action "double-clic".
    Si on reçoit WM_TIMER avant le second clic, on supprime le timer et le flag, et on effectue l'action "simple-clic"...

    </Réponse à la question hors sujet>
    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. #40
    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... merci

    Pour l'infobulle, je pense que tu ne m'as pas compris : je voudrais un ballon d'information, mais qui ne s'affiche que quand je le demande (par exemple, après un simple clic). Cela serait, par exemple, pour montrer des infos sur la musique en cours.

    En fait, il me faudrait une fonction dans le genre ShowBalloon()...
    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