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. #21
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    Salut.
    C'est super : ACTION .... REACTION. Merci pour la rapidité de tes réponses qui confirme ce que je pense sur ce forum : EXCELLENT !
    Eu .... comment je fais pour créer une FONT en GLOBAL afin de l'utiliser partout dans mon projet.

  2. #22
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    LOGFONT lf;
    memset(&lf, 0, sizeof(LOGFONT)); 
    strcpy(lf.lfFaceName, "Arial"); 
    int PointSize=12;// 12 points de hauteur
    HDC hDC=::CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);// dc d'ecran
    lf.lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);// hauteur en point
    ::DeleteDC(hDC);
    HFONT hFont=::CreateFontIndirect(&lf);

  3. #23
    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é. Pour ceux que ca interesse :
    Dans un fichier de type H écrire :
    Et dans le fichier principale telle que Main.cpp tu déclare une variable identique à MaFont en extern et tu initialise ta font :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    extern HFONT MaFont 
    ....
    MaFont = CreateFont(Taille,0,0,0,GRAS,ITALIC,SOULIGNE,BARRE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial")
    Es-ce que je me trompe?

  4. #24
    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
    createfont ou createfondindirect sont deux méthodes pour créer une fonte, createfont reprend individuellement les éléments d'une LOGFONT.
    pour ta vairiable globale:
    dans un .h ex :MyInc.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef GLOBAL_DEC
    HFONT hGlobalFont;
    #else
    extern HFONT hGlobalFont;
    #endif
    dans un seul .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define GLOBAL_DEC 1
    include "MyInc.h"
    pour les autres .cpp il suffit de faire un include "MyInc.h"

  5. #25
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    OK.
    Mais les fonctions GetTextExtentPoint32 et SetWindowPos utilisent-elles la même unités de mesure.
    Car si je prend un exemple, je créer un static avec une FONT dont les caractéristiques sont : TAILLE = 20, Gras, Italique, Arial.
    Et je souhaite connaitre la taille réelle de mon texte avec GetTextExtentPoint32 et ensuite redimensionner le static avec SetWindowPos.
    Es-ce ca va marché car la taille du texte est lié à la résolution de l'écran et l'autre pas.
    J'espère que tu auras réussit à me comprendre.

  6. #26
    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
    Citation Envoyé par Mirsa
    OK.
    Mais les fonctions GetTextExtentPoint32 et SetWindowPos utilisent-elles la même unités de mesure.
    Car si je prend un exemple, je créer un static avec une FONT dont les caractéristiques sont : TAILLE = 20, Gras, Italique, Arial.
    Et je souhaite connaitre la taille réelle de mon texte avec GetTextExtentPoint32 et ensuite redimensionner le static avec SetWindowPos.
    Es-ce ca va marché car la taille du texte est lié à la résolution de l'écran et l'autre pas.
    J'espère que tu auras réussit à me comprendre
    .
    non pas vraiment ,
    c'est quoi l'autre ?
    on travaille en pixels c'est tout, on a récuperé la taille du texte en pixels et on adapte la taille du controle en consequence .

  7. #27
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    L'exemple sera bien mieux que les mots.
    Alors je créer un STATIC avec une font puis je la redimensionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MaFont1 = CreateFont(50,0,0,0,FALSE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial");
    hWin = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL);
    SendMessage(Hwnd_Static,WM_SETFONT,(UINT)MaFont1,TRUE);
    hGdiOld = SelectObject(GetDC(Hwnd_Static),MaFont1);
    GetTextExtentPoint32(GetDC(Hwnd_Static),pName,strlen,pName),&size);
    SetWindowPos(Hwnd_Static,NULL,0,0,size.cx,size.cy,SWP_NOMOVE|SWP_NOZORDER);
    SelectObject(GetDC(GetDlgItem(hDlg,Id)),hGdiOld);
    ReleaseDC(GetDlgItem(hDlg,Id),GetDC(GetDlgItem(hDlg,Id)));
    Ensuite je créer un autre STATIC avec une autre FONT puis je la redimensionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MaFont 2= CreateFont(15,0,0,0,TRUE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial");
    hWin = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL);
    SendMessage(Hwnd_Static,WM_SETFONT,(UINT)MaFont2,TRUE);
    hGdiOld = SelectObject(GetDC(Hwnd_Static),MaFont2);
    GetTextExtentPoint32(GetDC(Hwnd_Static),pName,strlen,pName),&size);
    SetWindowPos(Hwnd_Static,NULL,0,0,size.cx,size.cy,SWP_NOMOVE|SWP_NOZORDER);
    SelectObject(GetDC(GetDlgItem(hDlg,Id)),hGdiOld);
    ReleaseDC(GetDlgItem(hDlg,Id),GetDC(GetDlgItem(hDlg,Id)));
    Dans les deux cas, on s'apercoit à l'écran que le "rectangle" de chaque STATIC n'est pas bien redimensionner (surtout pour MaFont1) donc je ne peux pas placer le second STATIC pile poils après le premier.
    Il se peut .... voir même quasi sur ... que je me suis planter dans mon code.

  8. #28
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    J'ai fais des tests avec deux static dont chacun utilise une FONT différentes (MaFont1 => TAILLE=20 et MaFont2 => TAILLE=15).
    Ca me donne ca :
    Nom : Deux STATIC aligner.jpg
Affichages : 77
Taille : 3,8 Ko
    On voit que le texte est tronquer et que le rectangle de mon STATIC n'est pas redimensionner.

  9. #29
    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
    re,
    ce n'est pas tout a fais ce que je t'avais dis ...
    le premier static tu le redimensionne en fonction de son contenu.
    le deuxieme il faudra le deplacer en fonction du premier static
    pour calculer les coordonnées il faut recuperer l'emplacement windows du premier et coler le second a coté ...
    ps: tu m'as fait un gros massacre à la hache dans ton code avec GetDC ....
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    void SetStatic(HWND hWin,HFONT hFont)
    {    
        SendMessage(hWin,WM_SETFONT,(UINT)hFont,TRUE);
        HDC hDC=GetDC(hWin);
        hGdiOld = SelectObject(hDC,hFont);
        SIZE size;
        char szName[255];
        GetWindowText(hWnd, szName,sizeof(szName));
        GetTextExtentPoint32(hDC,szName,strlen(szName),&size);
        SetWindowPos(hWin,NULL,0,0,size.cx,size.cy,SWP_NOMOVE|SWP_NOZORDER);
        SelectObject(hDC,hGdiOld);
        ReleaseDC(hWin,hDC);    
    }
    HFONT MaFont1 = CreateFont(50,0,0,0,FALSE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial");
        HWND hWin = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL);
        SetStatic(hWin,MaFont1);
     
        HFONT MaFont2= CreateFont(15,0,0,0,TRUE,TRUE,TRUE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"Arial");
        HWND hWin1 = CreateWindowEx(ExFlags, pClass, pName, WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | Flags,x, y, w, h, hDlg, NULL, WINMAIN_hInst, NULL);
        SetStatic(hWin1,MaFont2);
     
        RECT Rect;
        ::GetClientRect(hWin,&Rect); // 1 static coord screen
        POINT pt;
        pt.x=Rect.left;
        pt.y=Rect.top;
        ::ScreenToClient(hDlg,&pt);   // conversion en coord cliente
        pt.x+=(Rect.right-Rect.left); // x= fin du premier static. position x += largeur du static.
     
        ::GetClientRect(hWin1,&Rect); //2 static coord screen
        POINT pt2;
        pt2.x=Rect.left;
        pt2.y=Rect.top;                  // y = hauteur actuelle du static.
        ::ScreenToClient(hDlg,&pt2);  // conversion en coord cliente
        SetWindowPos(hWin1,NULL,pt.x,pt2.y,0,0,SWP_NOSIZE|SWP_NOZORDER); // deplacement uniquement pas la taille.
    a tester j'ai ecris sans pouvoir tester, il y avait pleins d'erreurs dans ton code ...

  10. #30
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    Bonjour,
    Euh à propos de ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::GetClientRect(hWin,&Rect);
    Il n'y a pas un binzzz ? Car si je lit l'aide MSDN, la fonction GetClientRect permet de réccupérer les dimension du rectangle client et non la poisition de cet élément à l'écran.
    Je pense que c'est GetWindowRect qu'il faut utilisé.
    Tu crois pas ?

    P.S. : merci pour ton aide

  11. #31
    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 effectivement je me suis planté ,c'est bien GetWindowRect qu'il faut utiliser.

  12. #32
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Ou bien, si on cherche la position du rectangle client à l'écran et non celle du rectangle complet, on peut utiliser GetClientRect() et MapWindowPoints()...
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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