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 :

[Win32] : Problème avec PS_DOT et PS_GEOMETRIC


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut [Win32] : Problème avec PS_DOT et PS_GEOMETRIC
    Bonjour,

    Je souhaite tracer une courbe en pointillé en utilisant GDI.
    Cependant, j'ai remarqué qu'avec un nombre important de lignes, l'execution se ralentit jusqu'au freeze de la machine.

    Voici un extrait de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    LOGBRUSH lb;
    lb.lbColor = col,
    lb.lbHatch = 0;
    lb.lbStyle = BS_SOLID;
    
    DWORD dwPenStyle = PS_DOT| PS_GEOMETRIC;
    HPEN hPen = ::ExtCreatePen( dwPenStyle, lLineWidth, &lb, 0, NULL );
    
    for ( long lIndex=1; lIndex<lCount; ++lIndex )
    {
    ::LineTo( hdc, pPoints[lIndex].x, pPoints[lIndex].y );
    }
    Si je remplace PS_GEOMETRIC par PS_COSMETIC le probléme ne se produit pas, néanmoins les pointillés sont plutot des traits d'union et on ne peut pas avoir une epaisseur de trait superieur à 1 (d'aprés la doc) ce qui ne me convient pas.

    Merci par avance de votre aide.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Questions :
    1/ Fais-tu le ExtCreatePen qu'une seule fois et pas à chaque dessin ?
    2/ Fais-tu bien le selectObject ?
    3/ A la fin du dessin tu (re)sélectionne l'ancien (retour de selectObject) ?
    4/ Tu libères bien (DeleteObject ) ?
    En fait, un peu plus du code de ta fonction de dessin pourrait aider.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Tout d'abord merci pour la rapidité de ta réponse

    1/ Fais-tu le ExtCreatePen qu'une seule fois et pas à chaque dessin ?
    Je fais le ExtCreatePen qu'une seule fois

    2/ Fais-tu bien le selectObject ?
    oui je fais le selectObject après avoir fait le ExtCreatePen
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HPEN hOldPen = (HPEN) ::SelectObject( hdc, hPen );
    3/ A la fin du dessin tu (re)sélectionne l'ancien (retour de selectObject) ?
    oui je fais bien SelectObject de l'ancien pen:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::SelectObject( hdc, hOldPen );
    4/ Tu libères bien (DeleteObject ) ?
    et á la fin je libère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::DeleteObject( hPen );
    En fait, un peu plus du code de ta fonction de dessin pourrait aider.
    Voici la fonction complète:
    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
    43
    44
    45
     
     
    /// Draw the trend lines.
    ///
    /// @param hdc Device context to draw into.
    /// @param pPoints Array of point coordinates.
    /// @param lCount Number of elements in pPoints.
    ///
    static void DrawTrendLine( HDC hdc, POINT* pPoints, long lCount, long lLineWidth, OLE_COLOR col )
    {
        if ( pPoints == NULL || lCount < 2 )
        {
            // Less than two points. No line.
            return;
        }
        if ( lLineWidth <= 0 )
        {
            // No line width.
            return;
        }
        // 
        LOGBRUSH lb;
        lb.lbColor = col,
        lb.lbHatch = 0;
        lb.lbStyle = BS_SOLID;
        //
        DWORD dwPenStyle = PS_DOT | PS_GEOMETRIC;
        HPEN hPen = ::ExtCreatePen( dwPenStyle,
         lLineWidth,
         &lb,
         0,
         NULL );
        HPEN hOldPen = (HPEN) ::SelectObject( hdc, hPen );
     
        //
        ::MoveToEx( hdc, pPoints[0].x, pPoints[0].y, NULL );
     
        //
        for ( long lIndex=1; lIndex<lCount; ++lIndex )
        {
            ::LineTo( hdc, pPoints[lIndex].x, pPoints[lIndex].y );
        }     
        ::SelectObject( hdc, hOldPen );
        ::DeleteObject( hPen );
    }

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Pourquoi ne pas sortir la création du Pen au niveau de ta fenêtre ou de ton application. Tu n'auras pas à le créer à chaque dessin, mais juste à le sélectionner (et le libérer à la fin bien sûr).
    Quelle est l'ordre de grandeur de lCount ?
    Est-ce que tu as fait une trace de tes points (pPoints) pour voir s'il n'y avait pas d'incohérence (des très très grandes/petites valeurs) ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonne idée, je vais essayer de sortir la création du pen.
    Le lCount varie entre 1000 et 2000 points.
    Et c'est vrai que parmi ces points, il se trouve toujours un du style: {x=106732 y=145}, mais en mettant un point d'arrêt à la fonction LineTo, il ne reste bloqué à cet endroit que très peu, mais suffisant pour que j'y inclut un test. Merci

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Le nombre de points que tu mentionnes n'est pas suffisant pour justifier un tel ralentissement. 2000 points c'est peanuts. Les pistes que je vois :
    -> La création répétée du HPEN peut ralentir ta fonction de dessin ? Et pour peu que t'aies une fuite quelque part sur ce handle, Donc autant le sortir de la fonction de dessin et le garder au niveau de la fenêtre ou de l'application.
    -> Il me semble me souvenir (mais Alzheimer est parfois cruel sur les souvenirs) que lorsque tu demandes à dessiner des points très très loin, ça pose des problèmes : tu devrais filtrer ton tableau (un clipping manuel ?) pour enlever les 'anomalies'.

Discussions similaires

  1. [Lazarus] [0.9.27/Win32] Problème avec tables paradox
    Par dnode57 dans le forum Lazarus
    Réponses: 2
    Dernier message: 10/10/2008, 16h32
  2. Réponses: 6
    Dernier message: 18/12/2007, 10h42
  3. Problèmes avec Delphi 2007 win32 SP3
    Par pascal07 dans le forum EDI
    Réponses: 1
    Dernier message: 13/11/2007, 10h02
  4. [Débutant] Problème avec Lcc-Win32
    Par rrafAel dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 11/10/2006, 18h16
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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