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

Visual C++ Discussion :

Modifier la couleur d'un STATIC avec les API windows


Sujet :

Visual C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut Modifier la couleur d'un STATIC avec les API windows
    Bonjour,
    Je suis débutant et j'ai repris un projet developper sous Visual C++ et tout est écrit avec des appels aux API windows.
    L'application créer des élements STATIC et moi je souhaite que ces éléments STATIC (du texte) soit afficher en rouge par exemple.
    Remarque : la fenêtre principale est appelé de cette manière :
    DialogBox(WINMAIN_hInst, MAKEINTRESOURCE(IDD_BLANK), hDlg, _cbDialog);

    Comment faire?
    Mille merci.

  2. #2
    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
    Traiter le message WM_CTLCOLORSTATIC.

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Désolé mais il me faut un peu plus de détail avec un exemple s'il te plait.
    Cela dit est-il possible d'utiliser la fonction API SendMEssage afin d'envoyer un message pour que un seul élément STATIC change de couleur.

  4. #4
    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
    Pas à ma connaissance.
    Il faut que ta fenêtre traite le message WM_CTLCOLORSTATIC, et différencie le contrôle par son handle passé en paramètre...

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Merci dejà pour tes réponses.

    Dis moi si je me trompe mais le traitement des messages ce fait-elle par la fonction static BOOL CALLBACK _cbDialog(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) ?

  6. #6
    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
    Oui, c'est ça.
    Typiquement, cette fonction contient un grand switch(), avec un case pour chaque message traité et un default qui retourne FALSE pour une boîte de dialogue.

    Au fait: Les conventions ont un peu évolué, ta _cbDialog devrait à présent retourner un INT_PTR au lieu d'un BOOL (pour la portabilité 64 bits).
    Teste avec INT_PTR, et si ta version de visual ne le supporte pas remet BOOL...

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Ca marche presque :

    Voici le code que j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      case WM_CTLCOLORSTATIC:
          //switch (LOWORD(wParam)){
      //case ID_STATIC1 :
          if (((HWND)lParam == GetDlgItem (hDlg,ID_STATIC1)) )
          {
            SetTextColor((HDC) wParam,RGB(255,0,0));
            SetBkColor   ((HDC)wParam, CLR_NONE); 
            return ((LRESULT) GetStockObject(TRANSPARENT));
          }
          else
              return FALSE;
          break;
    Le problème est que mon texte (STATIC) s'affiche en rouge mets sur font noir.Comment faire pour que le texte s'affiche en rouge mais sur fond transparent?
    Merci de penser à mettre la balise de code, Farscape

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    rajoute un SetBkMode(HDC,TRANSPARENT).




  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Je sens que l'on arrive au but :
    Maintenant mon texte s'affiche bien en rouge mais le cadre que j'ai créer avec CreateWindowEx(0, "STATIC", "Mon Texte en rouge", WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | SS_CENTER,11, 70, 320, 30, hDlg, NULL, WINMAIN_hInst, NULL); reste sur un fond gris : un peu plus gris que le fond de ma fenêtre.
    Comment faire pour que ce cadre apparaise en transparent?

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    moi j'aurai fait en sorte d'utiliser un fond gris sur le SetBkColor et sur le handle de brush retourné ...
    en utilisant un GetSysColor(COLOR_WINDOW) pour le setBkColor et GetSysColorBrush pour la brush..

  11. #11
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Désolé mais j'ai pas tout capté.
    A partir de ce morceau code ci-dssous peux-tu me compléter et l'expliquer les modifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      case WM_CTLCOLORSTATIC:
          if (((HWND)lParam == GetDlgItem (hDlg,ID_STATIC1)) )
          {
            SetTextColor((HDC) wParam,RGB(255,0,0));
            SetBkMode((HDC)wParam,TRANSPARENT);
            return ((LRESULT) GetStockObject(TRANSPARENT));
          }
          else
              return FALSE;
          break;
    Nom : MonTextEnRouge.jpg
Affichages : 204
Taille : 3,0 Ko
    Si tu regarde bien l'image qui est avec ce message tu verras que le texte est dans un cadre gris et au tour (la fenetre) est en gris plus clair.
    Mille merci pour vos aides.

  12. #12
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    J'ai trouvé !!!!
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      case WM_CTLCOLORSTATIC:
          if (((HWND)lParam == GetDlgItem (hDlg,ID_STATIC1)) )
          {
            SetTextColor((HDC) wParam,RGB(255,0,0));
            SetBkMode((HDC)wParam,TRANSPARENT);
            return (BOOL)GetStockObject(NULL_BRUSH);
          }
          else
              return FALSE;
          break;
    Il faut mettre NULL_BRUSH afin de ne pas modifier la couleur de fond du STATIC.
    Qu'en penses-tu?

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui null brush c'est correcte alors que GetStockObject(TRANSPARENT) a priori ça n'existe pas .
    ps:pense a mettre les balises de code dans ton code

  14. #14
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    OK.
    Tous fonctionne à merveille.
    Je me permet de continuer à poser des questions pendant que l'on est sur le sujet des STATIC.
    Je créer deux STATIC de cet manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CreateWindowEx(0, "STATIC", "Mon STATIC1", WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | SS_CENTER,11, 70, 320, 30, hDlg, NULL, WINMAIN_hInst, NULL);
    et 
    CreateWindowEx(0, "STATIC", "Mon STATIC2", WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | SS_CENTER,50, 70, 320, 30, hDlg, NULL, WINMAIN_hInst, NULL);
    Comment je peux faire pour aligner ces deux éléments?
    Je souhaite que le texte du STATIC2 commence pile poils à la fin du texte du STATIC1.

  15. #15
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Je me permet de relancer ma question : Comment faire pour aligner deux éléments de type STATIC contenant du texte?
    S'il vous plait aidez moi la dessus car je suis à la traine !

  16. #16
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    et bien il faut calculer la position du deuxieme static en fonction du premier.
    pour cela il faudrait que le premier colle au plus pres de son contenu .
    c'est a dire qu'il faudrait:
    calculer la largeur en pixels de ton texte.
    ajuster la taille du controle a celle calculée pour son contenu.
    enfin placer l'autre controle au plus prés à coté .
    taille d'un texte en pixels:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SIZE size;
    VERIFY(::GetTextExtentPoint32(hDC, lpszString, nCount, &size));
    size.cx te donne la largeur de ton texte.
    il te reste a faire un SetWindowPos pour ajuster le controle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SetWindowPos( hWnd,NULL,0,0,size.cx,cy,SWP_NOMOVE|SWP_NOZORDER);
    

  17. #17
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    OK.
    Et ceci quelque soit la FONT(police, style, taille) que l'on associe à notre STATIC?

  18. #18
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui,
    il faudra selectionner la fonte dans le dc avant d'appeler GetTextExtentPoint32

  19. #19
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Rappel moi s'il te plait la manière de sélectionner une font avant d'utiliser GetTextExtentPoint32.
    Merci pour tes réponses qui m'ont permis d'avancer dans mon projet.

  20. #20
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // HFONT hFont; initialisé avec CreateFontIndirect
    HWND hStatic=GetDlgItem(hDlg,ID_STATIC1);
    HDC hDC=GetDC(hStatic); 
    HGDIOBJ hGdiOld=SelectObject(hDC,hFont);
    SIZE size;
    char sz[]="essai";
    ::GetTextExtentPoint32(hDC, sz, strlen(sz), &size);
    SelectObject(hDC,hGdiOld);
    ReleaseDC(hStatic,hDC);

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/02/2013, 14h00
  2. Comment ajouter une chaîne dans une liste avec les API Windows ?
    Par DelphiCool dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 02/02/2013, 13h47
  3. Réponses: 12
    Dernier message: 22/06/2010, 11h09
  4. Réponses: 11
    Dernier message: 21/04/2008, 09h42
  5. Réponses: 69
    Dernier message: 15/06/2006, 11h42

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