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 :

Couleur de fond d'un controle d'edition


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de Code Rom
    Homme Profil pro
    Cherche et essaie de corriger les bugs, ici ou là.
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Cherche et essaie de corriger les bugs, ici ou là.

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut Couleur de fond d'un controle d'edition
    Bonjour,

    a partir du tutoriels de CGI je fait un programme similaire a notepad.Et j'ai ajouté une option pour modifier la couleur de fond du contrôle d'édition.

    J'ai donc créer une boite de dialogue avec 3 slide bar (une pour chaque couleur : RGB).

    J'arrive a récupérer les valeurs de chaque bar, mais je n'arrive pas a changer la couleur de fond du hEdit.SetBkColor() ne fonctionne pas.
    Et je souhaiterais que la couleur change en temps réelle, quand on bouge l'une des slide bar.

    Avez vous des pistes a me donner ?

    Merci.

    PS: je suis loin d'être un pro en winapi.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 509
    Par défaut
    Le faite vous au bon endroit ?
    http://www.functionx.com/win32/Lesson12.htm

  3. #3
    Membre confirmé
    Avatar de Code Rom
    Homme Profil pro
    Cherche et essaie de corriger les bugs, ici ou là.
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Cherche et essaie de corriger les bugs, ici ou là.

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Sa y est j'y suis arrivé, mais j'ai un autre problème.

    Je récupère bien les valeurs de chaque couleurs (RGB), via les 3 slide bars de ma boite de dialogue.
    J'envoies ces valeurs a la procédure de la fenêtre principale.Mais cela peint uniquement le fond de la fenêtre principal qui se trouve derrière ma boite de dialogue, pour peindre l'ensemble de la fenêtre je doit bouger la boite de dialogue comme un pinceau sur l'ensemble de la fenêtre principale.
    J'ai fait une petite vidéo pour vous montrez.

    Je vous donne le code qui gère la couleur :

    Procédure de la fenêtre principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            case WM_CTLCOLOREDIT :
                {
                    hEditColor = CreateSolidBrush(RGB(colors[0], colors[1], colors[2])); /* coleur du fond */
                    hdc = (HDC)wParam;
                    SetTextColor(hdc, RGB(0,255,0)); /* couleur du texte */
                    SetBkColor(hdc, RGB(colors[0], colors[1], colors[2])); /* couleur du fond derriere le texte !! */
    
                    return (LONG)hEditColor;
                }
    Procédure de la boite de dialogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            case WM_HSCROLL :
                {
                /*  Récupère les valeurs de chaque couleurs.
                    Et les envoit a la procédure de fenêtre principale */
                    for(i = 0; i < 3; i++){
                        colors[i] = SendMessage(htb[i], TBM_GETPOS, 0, 0);
                        SendMessage(hEdit, WM_CTLCOLOREDIT, colors[i], 0);
                    }
    
                    return TRUE;
                }
    La petite vidéo : http://www.speedyshare.com/files/19466285/Exple.avi

    Merci, A+++

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Attention, ton code pour WM_CTLCOLOREDIT sent la fuite à plein nez.

    Ensuite, ton problème est un problème de rafraichissement, non? Un bon InvalidateRect() où il faut devrait corriger le problème.
    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 confirmé
    Avatar de Code Rom
    Homme Profil pro
    Cherche et essaie de corriger les bugs, ici ou là.
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Cherche et essaie de corriger les bugs, ici ou là.

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    Effectivement avec InvalidateRect() sa fonctionne.

    Pour la fuite de memoire, je pense (sans être vraiment sur), qu'il faut déplacer le
    hEditColor = CreateSolidBrush(RGB(colors[0], colors[1], colors[2]));

    Car juste en mettant un printf() sur la valeur colors[0], par exple.Je voit que ça créer la brush "50 fois" sans même que je bouge une slide bar.

    J'ai donc modifier comme ceci :

    Procédure de la fenêtre principale :
    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
            case WM_CREATE : /** OK **/
                {
                    hEdit = CreateWindow("EDIT", "Texte",
                                    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN,
                                            0, 0, 0, 0, notePadWnd, NULL, hInstance, NULL);
                    /* fond noir par defaut */
                    hEditColor = CreateSolidBrush(RGB(0,0,0));
    
                    return 0;
                }
    
            case WM_CTLCOLOREDIT :
                {
                    /* couleur du fond */
                    hdc = (HDC)wParam;
                    SetTextColor(hdc, RGB(0,255,0)); /* couleur du texte */
                    SetBkColor(hdc, RGB(colors[0], colors[1], colors[2])); /* couleur du fond derriere le texte !! */
    
                    return (LONG)hEditColor;
                }
    Procédure Boite de dialogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            case WM_HSCROLL :
                {
                    InvalidateRect(hEdit, NULL, TRUE);
                    hEditColor = CreateSolidBrush(RGB(colors[0], colors[1], colors[2]));
    
                /*  Récupèere les valeurs de chaque couleurs.
                    Et les envoit a la procédure de fenêtre principale */
                    for(i = 0; i < 3; i++){
                        colors[i] = SendMessage(htb[i], TBM_GETPOS, 0, 0);
                        SendMessage(hEdit, WM_CTLCOLOREDIT, colors[i], 0);
                    }
    
                    return TRUE;
                }
    Est ce que je me trompe encore ou pas ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Dans le traitement de WM_HSCROLL, tu dois supprimer l'ancienne Brush avant d'écraser le handle.

    Aussi, caste en LRESULT plutôt qu'en LONG, pour la compatibilité 64 bits.
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/09/2013, 16h25
  2. Réponses: 1
    Dernier message: 02/10/2010, 16h43
  3. TDBGRID - Couleur de fond d'une seule cellule
    Par cgo dans le forum Bases de données
    Réponses: 5
    Dernier message: 11/09/2009, 10h16
  4. Changer couleur de fond d'un control sur prise / perte de focus
    Par nicodev24 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/01/2008, 10h53
  5. [Vb.Net] Changer la couleur de fond d'un control "désactivé"
    Par Thierryx dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/09/2006, 19h02

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