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 :

Tracer puis effacer sur un TImage.


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut Tracer puis effacer sur un TImage.
    Salut,
    Salut, j'ai une image sur laquelle je voudrais réaliser une sorte de viseur qui suit la souris (une croix qui a la dimension de l'image et dont le centre se situ toujours sous le pointeur de la souris).
    Pour tracer ma croix qui suit la souris pas de probléme (partie horizontale de mon viseur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall View::ImageOnMove(TObject *Sender,TShiftState Shift, int X, int Y)
    {
            Image->Canvas->MoveTo(0,Y);
            Image->Canvas->LineTo(Image->Width, Y);
    }
    Mais forcément, je me retrouve avec plein de ligne horizontale sur mon image.
    Je pensais effacer le canvas avant chaque nouveau tracé, mais je n'ai pas trouvé la méthode...

    Donc : y a t-il une solution pour effacer ma derniére ligne tracé sans recharger complétement mon image?
    Ou alors avait vous une autre solution pour arriver a mes fins ?

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Soit tu efface complètement le Canvas de ton image en dessinant dans le Canvas de ton image, un rectangle avec ta couleur de fond.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall View::ImageOnMove(TObject *Sender,TShiftState Shift, int X, int Y)
    {
           // On efface le Canvas
           Image->Canvas->Rectangle(Image->Left, Image->Top, (Image->Left + Image->Width), (Image->Top + Image->Height); 
     
            // On dessine ta nouvelle ligne
            Image->Canvas->MoveTo(0,Y);
            Image->Canvas->LineTo(Image->Width, Y);
    }
    Sinon pour un soucis de raffraichissement plus fluide, il serait mieux de juste effacer l'ancienne ligne et de dessiner ta nouvelle, cela d'évite d'effacer complètement le Canvas.

    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
     
     
    // Variable Globale
    int XSouris, YSouris;     // Coordonnées mémorisé de la souris
     
    // booléen pour savoir s'il on est dans le premier déplacement
    bool PremierDep;   // Tu l'initialise à true;
     
    void __fastcall View::ImageOnMove(TObject *Sender,TShiftState Shift, int X, int Y)
    {
            // Si l'on est dans le premier déplacement
            if(PremerDep)
            {
                   // On marque que l'on n'est plus dans le premier déplacement
                   PremierDep = false;
            }
            // Sinon on n'est pas dans le premier déplacement
            else
            {
                   // On efface l'ancienne ligne
                   Image->Canvas->MoveTo(0, YSouris);
                   Image->Canvas->LineTo(Image->Width, YSouris);
            }
     
            // On dessine ta nouvelle ligne
            Image->Canvas->MoveTo(0,Y);
            Image->Canvas->LineTo(Image->Width, Y);
     
            // On mémorise les coordonnées de la souris pour le prochain déplacement
            XSouris = X;
            YSouris = Y;
    }
    Voilà

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse,
    Mais le probléme c'est que cette méthode créer des ligne sur mon image.
    Quand j'efface l'ancienne ligne en traçant une autre ligne par dessus (par exemple en blanc), ben je me retrouve avec une ligne blanche sur l'image qui est affichée...
    Si tu as une autre idée, elle est la bien venue.
    Merci.

  4. #4
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    il faut tracer ta ligne avec la couleur de fond de ton image si tu veux qu'elle ne soit voit pas. Escuse moi j'ai oublier de préciser.

    Admettons que le fond de ton image c'est blanc
    et que les lignes que tu tace sont rouge.

    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
     
    // Variable Globale
    int XSouris, YSouris;     // Coordonnées mémorisé de la souris
     
    // booléen pour savoir s'il on est dans le premier déplacement
    bool PremierDep;   // Tu l'initialise à true;
     
    void __fastcall View::ImageOnMove(TObject *Sender,TShiftState Shift, int X, int Y)
    {
            // Si l'on est dans le premier déplacement
            if(PremerDep)
            {
                   // On marque que l'on n'est plus dans le premier déplacement
                   PremierDep = false;
            }
            // Sinon on n'est pas dans le premier déplacement
            else
            {
                   // On positionne la couleur de dessin sur la couleur de l'arrière-plan de l'image
                   Image->Canvas->Pen->Color = clWhite;
                   Image->Canvas->Brush->Color = clWhite;
     
                   // On efface l'ancienne ligne
                   Image->Canvas->MoveTo(0, YSouris);
                   Image->Canvas->LineTo(Image->Width, YSouris);
            }
     
            // On définit la couleur de dessin pour les lignes
            Image->Canvas->Pen->Color = clRed;
            Image->Canvas->Brush->Color = clRed;
     
            // On dessine ta nouvelle ligne
            Image->Canvas->MoveTo(0,Y);
            Image->Canvas->LineTo(Image->Width, Y);
     
            // On mémorise les coordonnées de la souris pour le prochain déplacement
            XSouris = X;
            YSouris = Y;
    }

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    Merci, mais mon image peut changer (chargement de photo), donc ma couleur de fond n'est pas fixe.
    Il faudrait donc qu'a chaque mouvement de ma souris je copie une ligne de mon image de fond et que je la restitue aprés. C'est ça ?
    Ca risque de pomper pas mal de ressources (je fais l'opération sur plusieur photo en même temps).
    Mais bon, si j'ai pas le choix...

    Merci beaucoup.

    PS : j'attend un peu avant de mettre la discussion en "résolue".

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Au plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TPoint Pos; //mémoriser la position du dessin
    bool Flag; //dessinée ou non
    Image1->Canvas->Pen->Mode = pmNot;
    Pour déplacer :

    Si on a dessiné, alors on redessine à l'ancienne position et on dessine à la nouvelle.
    Si non, on dessine et on met Flag à true.
    Mémoriser la position à la fin !

    A plus !

  7. #7
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    tu n'avais pas préciser que le fond de ton image n'était pas unis donc effectivement, ca coince avec ma méthode.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    Ok, merci a tous les 2.
    kurul1 : Désolé pour les précision manquantes, et merci beaucoup.

    henderson : Ta solution fonctionne impeccable.

    Merci,
    A+.

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

Discussions similaires

  1. Dessiner puis effacer par dessus un TImage
    Par jackvpt dans le forum Composants VCL
    Réponses: 5
    Dernier message: 07/02/2011, 20h09
  2. Write puis read sur port com
    Par chourmo dans le forum API, COM et SDKs
    Réponses: 34
    Dernier message: 21/06/2005, 17h36
  3. Enregistrement clé effacée sur ACCESS
    Par gastonbach dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/05/2005, 11h51
  4. Info bulle sur un TImage
    Par Dauphin dans le forum C++Builder
    Réponses: 4
    Dernier message: 30/09/2004, 13h56
  5. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06

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