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

C++ Discussion :

Un bouton bs_ownerdraw défini comme checkbox


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 41
    Points : 22
    Points
    22
    Par défaut Un bouton bs_ownerdraw défini comme checkbox
    Bonjour,

    désolé d'arriver vers vous avec comme premier poste une question, mais je suis sur un projet qui m'est important,
    et je m'arrache les cheveux sur ce bout de code.

    je cherche donc a creer un bouton qui reste enfoncé apres un clique dessus,
    la simple ligne "BS_AUTOCHECKBOX | BS_PUSHLIKE" faisait l'affaire, seulement... je le veux bleu.

    je suis arrive a ca:

    void Bouton(LPDRAWITEMSTRUCT lpds, LPCTSTR texte, COLORREF couleurtexte, COLORREF couleurfond)
    {
    SIZE dims;
    char nom[50];
    strcpy_s(nom, texte);
    GetTextExtentPoint32(lpds->hDC, nom, strlen(nom), &dims);
    SetTextColor(lpds->hDC, couleurtexte);
    SetBkColor(lpds->hDC, couleurfond);
    BOOL etat = lpds->itemState & ODS_SELECTED;
    int largeur = lpds->rcItem.right - lpds->rcItem.left;
    int hauteur = lpds->rcItem.bottom - lpds->rcItem.top;
    ExtTextOut(lpds->hDC, (largeur - dims.cx) / 2 + etat, (hauteur - dims.cy) / 2 + etat, ETO_OPAQUE | ETO_CLIPPED, &lpds->rcItem, nom, strlen(nom), NULL);
    DrawEdge(lpds->hDC, &lpds->rcItem, (etat ? EDGE_SUNKEN : EDGE_RAISED), BF_RECT);
    return;
    }
    (le bouton est defini suivant le parametre bs_ownerdraw et cette fonction appelée avec le message windows "WM_DRAWITEM"... )

    mais du coup, je ne vois pas comment faire pour que windows considere ce bouton comme une checkbox?


    (
    j'ai essayer de simplement creer une variable qui change de valeure entre 1 et 0 a la suite des cliques sur ce bouton et de le dessiner "enfoncé" et "relaché" suivant la valeure de cette variable.
    du genre:
    if 1 ---> drawedge (...... EDGE_SUNKEN)
    if 0 ---> drawedge (...... EDGE_RAISED)

    mais il semble y avoir un conflit quelque part: le premier clique n'est pas pris en compte et le bouton est redessiné des lors que la souris change de focus.
    )

    ...... help.. please !

  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
    J'ai bien peur que Owner Draw conflicte avec tout le reste, en fait:
    http://stackoverflow.com/a/7945490/1455631

    Regarde plutôt si traiter le message WM_CTLCOLORBTN te suffit... Edit: Ah non, c'est marqué que ça ne marche qu'en OwnerDraw.

    Dans ce cas, je pense que tu auras plus vite fait d'implémenter ton propre contrôle...

    Edit2: Tu peux aussi essayer de traiter le message WM_NOTIFY(NM_CUSTOMDRAW)...
    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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 41
    Points : 22
    Points
    22
    Par défaut
    heu. hm.

    Tu me dis donc d'abandonner la definition du bouton en tant qu'ownerdraw (est ce que je dois ajouter quelque chose a la definition du bouton?), et de le redessiner quand je recois "WM_NOTIFY(NM_CUSTOMDRAW)" ?
    ca resemblerait a.......
    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
     
    case WM_NOTIFY:
    {
          LPNMLISTVIEW  pnm = (LPNMLISTVIEW)lParam;
          switch (pnm->hdr.code)
          {
                case NM_CUSTOMDRAW:
                if (((LPNMHDR)lParam)->idFrom == BTN_BLEU)
                {
                      // la on repeint notre bouton ??
                }
                break;
          }
          break;
    }
    le truc, c'est que ca ne marche pas. donc j'ai le sentiment de n'avoir rien compris

  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 519
    Points
    41 519
    Par défaut
    C'est bien le genre de chose que je conseillais.

    PS: Évite les downcast dans des types dont on n'est pas certain que c'est bien le type pointé, c'est une mauvaise pratique. Le premier cast devrait être en NMHDR lui 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. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 41
    Points : 22
    Points
    22
    Par défaut
    Oook je ne recevais pas le message WM_NOTIFY.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #pragma comment(linker,"\"/manifestdependency:type='win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    il fallait appeler ce truc.

    je suis arrive a quelque chose de correct, merci !

Discussions similaires

  1. [E-00]tester si une cellule est définie comme liste de validation ?
    Par Australia dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/12/2008, 09h17
  2. Réponses: 2
    Dernier message: 28/10/2008, 09h30
  3. Principe des boutons radios sur les checkbox
    Par misterphil dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/10/2008, 16h34
  4. Bouton radio activant/desactivant checkbox - adaptation de la FAQ
    Par 12monkeys dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/09/2007, 16h38
  5. une boucle définie comme une methode
    Par scolopendra dans le forum Langage
    Réponses: 6
    Dernier message: 08/06/2007, 16h23

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