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

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

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

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    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 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
    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 habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    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 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
    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.

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut
    Ok, j'ai donc rajouté ç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
    16
            case WM_HSCROLL :
                {
                    InvalidateRect(hEdit, NULL, TRUE);
                    DeleteObject(hEditColor);
    
                    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;
                }
    Et j'ai casté aussi en LRESULT.

  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
    Attends, une minute, je n'avais pas vu un truc.
    C'est quoi ces SendMessage(WM_CTLCOLOREDIT) vers hEdit?
    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 habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut
    C'est pour envoyer les couleurs RGB a la procédure de la fenêtre principale.

    Chaque couleurs colors[0], colors[1] ect...étant récupérées juste avant ds la boucle.

    Edit : Ha effectivement sa marche aussi sans.

  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
    Mais WM_CTLCOLORxxx n'est pas supposé envoyer quoi que ce soit. Ce message sert seulement à demander des couleurs.

    De plus, hEdit est supposé désigner ta fenêtre principale?
    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 habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut
    non hEdit représente la surface client, ma fenêtre principale c'est un autre HWND.

    Après je débute encore en winapi, donc tout ces messages je connais pas très bien.C'est d'ailleurs la 1ere fois que j'utilise le message WM_CTLCOLOREDIT

  12. #12
    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
    Normalement, à moins de créer un contrôle perso, tu n'as jamais à envoyer de WM_CTLCOLORxxx nulle part.
    Et si tu écris un contrôle perso, tu n'envoies WM_CTLCOLORxxx qu'à GetParent(hWnd), et tu fais ça typiquement dans ton traitement du message WM_PAINT.

    En clair, le contrôle envoie WM_CTLCOLORxxx à son parent pour lui demander de quelle couleur il doit se dessiner.
    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.

  13. #13
    Membre habitué

    Profil pro
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Points : 126
    Points
    126
    Par défaut
    OK, du coup je pourrais peut être utiliser cette méthode (WM_PAINT et WM_CTLCOLOREDIT), pour changer la couleur du texte.

    Car je voulais le faire, mais que cela ne soit pas en temps réel comme le fond d'écran.Juste histoire de savoir le faire.Style une boite de dialogue et on rentre les valeurs RGB, on valide et hop la couleur du texte se met a jour.

    Je regarderait ça demain, et au besoin je re-posterais ici.

    Merci en tout cas pour ton aide.

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