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

C++ Discussion :

Font et CDC (dc)


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Par défaut Font et CDC (dc)
    Bonjour,

    J'ai un problème lors de l'utilisation de GetTextExtentPoint32.
    J'ai préalablement crée un DC de la manière suivante :

    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
     
    CDC cdc;
    ....
    hDCBis = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
    hDC = CreateCompatibleDC(hDCBis);
    if (hDC == 0)
    {
        m_eLastError = ERR_CREATEFAILED;
        return false;
    }
    cdc.Attach(hDC);
    ...
    ...
    str = new CString("X");
    size = cdc.GetTextExtent(*str);
    Dans le dernier appel, ça me fait un ASSERT sur l'API windows..
    Je pense que ça peut venir du fait que dans mon dc la police n'est pas précisé. Comment puis-je l'ajouter à mon DC.. est-ce le LOGFONT que je dois préciser? Comment l'ajouter??
    Merci d'avance pour vos eclaircissements.
      0  0

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    c'est du MFC ça
    Pourquoi ne pas faire, tout simplement,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CString str = "X";
    size = cdc.GetTextExtent(str);
    ?
      0  0

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Par défaut
    Ce n'est pas un problème de syntaxe..
    Mon code revient à la même chose.. et marche dans une autre application.
    cependant celle que je fais là ne possè-de pas d'interface à proprement parlé.
    C'est surement dû à ça. C'est une application qui est destinée à tourner
    enf tâche de fond, donc pas d'interface.
      0  0

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    D'accord, je te présente mes excuses, j'avais mal compris.
    Ton objet CDC est-il valide au moment de l'ASSERT?
      0  0

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Hé, je n'avais pas vu le multipost.
    Alors je reposte ici ma question: On peut savoir quelle est l'assertion qui plante ?
    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.
      0  0

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Par défaut
    C'est au niveau du GetTextExtent du cdc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Program: ...
    File: f:\rtm\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
    Line: 666
    ....
    J'arrive vraiment pas à comprendre d'où ça peut venir, mais je soupçonne le Font non initialisé sur le cdc (hdc).
    Qu'est ce qui défini un CDC comme étant valide ?
    Les seules lignes tappées concernant le CDC et le HDC sont dans le bout de code du 1er message.
    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    str = new CString("X");
    ::GetTextExtentPoint32(hDC, str->GetBuffer(), 1, &size);
    ...
    Size vaut n'importe quoi. En tout cas, tout sauf des vraies valeurs de taille.
    Après ça, j'ai fait un GetLastError() pour l'erreur éventuelle, mais ça me dit que mon opération s'est bien déroulée .
    Bref, je pédale dans une semoule de plus en plus fluide
    Merci quand même de m'aider
      0  0

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Le problème, je pense, c'est que si tu n'as pas d'affichage, le Device Contexte (CDC) ne doit pas être valide.

    Pour vérifier si de cdc est valide, regardes ses champs dans le quick watch et si tu vois plein de valeurs à 0x000000 ou 0xdcdcdcdc (ce genre de choses) c'est qu'il n'est pas valide.

    Hope it helps.
      0  0

  8. #8
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par Moustico
    C'est au niveau du GetTextExtent du cdc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Program: ...
    File: f:\rtm\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
    Line: 666
    ....
    J'arrive vraiment pas à comprendre d'où ça peut venir, mais je soupçonne le Font non initialisé sur le cdc (hdc).
    Qu'est ce qui défini un CDC comme étant valide ?
    Les seules lignes tappées concernant le CDC et le HDC sont dans le bout de code du 1er message.
    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    str = new CString("X");
    ::GetTextExtentPoint32(hDC, str->GetBuffer(), 1, &size);
    ...
    Size vaut n'importe quoi. En tout cas, tout sauf des vraies valeurs de taille.
    Après ça, j'ai fait un GetLastError() pour l'erreur éventuelle, mais ça me dit que mon opération s'est bien déroulée .
    Bref, je pédale dans une semoule de plus en plus fluide
    Merci quand même de m'aider
    Je pense qu'en parlant de fonte tu touches au problème, GetTextExtent*() utilise la fonte courante sélectionnée dans le contexte graphique pour déterminer la taille du texte.

    Donc il te faut en sélectionner une dans le contexte si il n'y en a pas :

    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
    37
    38
    39
    40
    41
    42
    // Ptr de contexte graphique
    CDC * pDC;
     
    [...]
     
    // Fonte
    CFont * oldFont = 0;
    CFont myFont;
    LOGFONT lf = { 0 };
    lf.lfHeight = 12;                      
    strcpy(lf.lfFaceName, "Arial");        
    VERIFY(myFont.CreateFontIndirect(&lf)); 
     
    [...]
     
    // Texte et taille de texte
    CString str("Hello");
    CSize txtSz;
     
    // Si fonte sélectionnée dans DC, OK on peut récup. la taille direct
    if ( pDC->GetCurrentFont()  )
    {
        txtSz = GetTextExtent(str);
    }
    else {
       // Sinon, on sélectionne une fonte dans le DC
       oldFont = pDC->SelectObject(&myFont);
     
        [...]
     
        txtSz = GetTextExtent(str);   
     
        // Dessin de texte avec CDC:DrawText() par exple
     
     
        [...]
     
        (void)pDC->SelectObject(oldFont);
     
    }
     
    myFont.DeleteObject();

    A+
      0  0

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Par défaut
    Le problème venait de là en effet,
    par contre, le font visiblement était là, mais certainement pas valide puisque le
    passage sur la condition GetCurrentFont était validée..
    Je recrée un Font avant et lui affecte et ça passe correctement.
    Merci encore
      0  0

  10. #10
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par Moustico
    Le problème venait de là en effet,
    par contre, le font visiblement était là, mais certainement pas valide puisque le
    passage sur la condition GetCurrentFont était validée..
    Je recrée un Font avant et lui affecte et ça passe correctement.
    Merci encore
    Effectivement, la doc de CDC::GetCurrentFont() dit "This member function may return temporary objects." Donc possibilité d'avoir des objets temporaires (bidons) ensuite détruits lorsque l'appli rentre en boucle "idle", comme les objets récupérés par *::FromHandle().

    A+
      0  0

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Merci d'éviter le multipost à l'avenir.

    Les règles du forum
    La suite du sujet
      0  0

Discussion fermée
Cette discussion est résolue.

Discussions similaires

  1. Image font d'ecran
    Par jeannot27 dans le forum C++Builder
    Réponses: 5
    Dernier message: 12/01/2004, 11h47
  2. [SWING][FONT] choisir la police par défaut
    Par narmataru dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/02/2003, 10h35
  3. [Technique] Index, comment font les moteurs de recherche ?
    Par bat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 25/10/2002, 15h41
  4. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53
  5. TextOut : comment changer de font
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 15/07/2002, 20h46

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