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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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
    Traiter le message WM_CTLCOLORSTATIC.
    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 averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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
    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...
    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 averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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
    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...
    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 averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    Par d�faut
    salut,
    rajoute un SetBkMode(HDC,TRANSPARENT).




  9. #9
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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 : 226
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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    Par d�faut
    oui,
    il faudra selectionner la fonte dans le dc avant d'appeler GetTextExtentPoint32

  19. #19
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    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
    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