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++Builder Discussion :

Souci de dessin.


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut Souci de dessin.
    Bonjour,

    Je suis actuellement sur la création d'un composant de dessin.
    Pour des raisons d'efficacité, j'ai choisi de dessiner dans un bitmap, et d'afficher ce bitmap à l'écran au moment du rafraichissement (Paint).
    Le composant sera placé en principe au dessus d'un TImage avec une photo dedans, en mode transparent.
    Première question : je n'ai pas trouvé de paramètre me permettant d'éviter le petit coup de flash au moment du rafraichissement du TImage. Une idée pour résoudre ce point (pour l'instant, je compte supprimer le TImage et la dessiner dans le fond du composant ou de la fenêtre de l'appli avec Draw) ?

    Mon dessin est composé de bitmaps, de lignes et de portions de texte.
    Pour dessiner ce texte, j'ai utilisé deux méthodes qui donnent le même résultat complètement pourri si j'active la transparence de mon bitmap (nécessaire pour pouvoir se superposer à la photo):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _canvas->TextOut(FAX-size.cx/2,FY-size.cy,FNom);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DrawText(_canvas->Handle,FNom.c_str(),FNom.Length(),&rect, DT_CENTER|DT_NOPREFIX|TA_TOP|TA_NOUPDATECP);
    Et voila ce que ca donne.



    Le texte du haut a été affiché par un TLabel, celui du bas par DrawText, en utilisant une copie de la fonte du TLabel. Ce sont les traces rouges qui polluent l'affichage. Je me suis amusé à agrandir la police (taille 30), et alors on voit bien la bordure d'une autre couleur, comme si le texte devait être dessiné en relief.
    A l'écran, les drawtext sont à peine visibles.
    Quelqu'un a-t-il déjà subi ce phénomène?
    Une (des) solutions auraient-elles été trouvées?

    Aux courageux qui ont réussi à lire jusque là j'adresse tous mes remerciements (aux autres aussi, mais ils ne les liront pas...).

    Cordialement,
    MP

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Teaniel
    Dans ta fonction DrawText
    DrawText(_canvas->Handle,FNom.c_str(),FNom.Length(),&rect, DT_CENTER|DT_NOPREFIX|TA_TOP|TA_NOUPDATECP);
    " TA_TOP|TA_NOUPDATECP " ces deux parametres n'existent pas conformement a l'aide en ligne de BCB

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    La transparence du texte est obtenue par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Canvas->Brush->Style = bsClear;
    Canvas->TextOut(..., ..., ....);
    Pourquoi utiliser un TImage supplémentaire (en tant qu'image de fond pour cet objet) ?
    Est-ce que tout ne pourrait pas être dessiné dans un seul objet (pour éviter la superposition des strates graphiques) ?

    A plus !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut
    Bonjour, et merci de vos réponses.

    Citation Envoyé par henderson Voir le message
    Salut !
    Canvas->Brush->Style = bsClear;
    Canvas->TextOut(..., ..., ....);
    Cette façon donne aussi ce résultat (Je crois que TextOut utilise la fonction DrawText de l'API Windows). Je l'avais bien entendu essayée auparavant, étant par nature (paresseuse) enclin à utiliser les fonctions des objets que je mets en oeuvre

    Citation Envoyé par henderson Voir le message
    Salut !
    Est-ce que tout ne pourrait pas être dessiné dans un seul objet (pour éviter la superposition des strates graphiques) ?
    C'est précisément ce que je compte faire pour l'instant.
    Cependant ce n'était pas planifié, car à l'origine mon composant devait simplement dessiner une figure sur un fond transparent.
    J'ai juste mis mon TImage dessous pour vérifier le résultat autrement que sur le fond gris de l'application.

    Citation Envoyé par blondelle Voir le message
    DrawText(_canvas->Handle,FNom.c_str(),FNom.Length(),&rect, DT_CENTER|DT_NOPREFIX|TA_TOP|TA_NOUPDATECP);
    " TA_TOP|TA_NOUPDATECP " ces deux parametres n'existent pas conformement a l'aide en ligne de BCB
    En effet, mais ils sont cités dans un exemple de l'aide BCB API Windows (fonction DrawText vers la fin un conseil en anglais). Ceci dit ils ne changent rien au problème. Normalement ils seront retirés (mon message a été écrit sur la base d'un copier/coller après un énième essai infructueux et en pleine frustration). Comment se fait-il que l'affichage TextOut ou DrawText soit tellement mauvais à côté du TLabel (que je rechigne à utiliser en raison du fait que ces affichages seraient très nombreux et ralentiraient considérablement mon processus d'affichage).

    Merci encore
    A bientôt
    MP

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut Solution?
    Finalement, je pense que j'ai trouvé la solution au problème de la qualité :
    J'ai affiché le fond dans celui de mon composant. Plus de reflet.
    Ceci dit, je ne comprends tout de même pas les causes de ce phénomène .
    Pour celui du flash au moment du dessin, je crois avoir vu quelque part, sauf que je n'arrive pas à me souvenir où, qu'on pouvait empêcher Windows d'effacer le cliprect avant de lancer Paint. Quelqu'un saurait me dire où on peut changer ce paramètre?

    Cordialement,
    MP

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Tout ce qui dérive de TWinControl possède une propriété Brush qui sert pour effacer la zone client avant qu'elle ne soit redessinée.
    Donc il me semble que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Brush->Style = bsClear;
    Les problèmes de scintillement peuvent ainsi être résolus sans utiliser le double buffering.

    Plus il y a de strates (superposées) qui effacent leur zone client et plus il y a de scintillement plus ou moins perceptible en fonction des couleurs qui entrent en lice.

    A plus !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut Solution : Ok
    Bonjour,

    En effet, c'est (presque) ça.
    Il faut simplement ne pas oublier de le mettre partout ou c'est nécessaire...

    Merci pour vos réponses.
    +++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Graphic] Dessiner des hachures
    Par sylverspoon dans le forum 2D
    Réponses: 7
    Dernier message: 22/03/2006, 21h46
  2. [File et Directory ListBox] Soucis de filtre
    Par Mercilius dans le forum Composants VCL
    Réponses: 8
    Dernier message: 04/04/2003, 16h17
  3. Réponses: 4
    Dernier message: 16/02/2003, 12h16
  4. Réponses: 2
    Dernier message: 03/10/2002, 17h24
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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