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 :

TpaintBox ou TCanvas : dessiner sur un autre "layer"


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 39
    Par défaut TpaintBox ou TCanvas : dessiner sur un autre "layer"
    Bonjour à tous,

    Je suis désole je pense que je vais paraitre vague, mais je vais tenter d'être le plus précis possible.

    Voila j'utilise actuellement un composant "PaintBox" sur lequel je dessine le spectre d'un son. Cette "PaintBox" fait partie d'un player, dans lequel je peux lire le son dont j'affiche le spectre.
    J'aimerais ajouter à cet affichage du spectre une barre verticale sensée représenter le "curseur" du player, et je ne vois pas réellement comment faire sans avoir à redessiner tout le spectre à chaque déplacement de ma "barre-curseur". Est-il possible d'ajouter un "Layer" transparent à un composant PaintBox, quelque chose qui me permettrait de dessiner une fois seulement le spectre, puis à chaque déplacement de mon curseur faire uniquement un "Clear Layer - Print cursor" ?

    Voila je vous remercie, et pardon si c'est trop confus, dites-le moi si on n'y comprend rien .

    ps : en gros pour faire simple, pour ceux qui ont déjà utiliser audacity, je cherche à faire le même effet que lorsque l'on lit un son dans cette appli.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Pourquoi n'utiliserais-tu pas un TChart pour dessiner ton spectre et ton curseur

    Ton spetre représenterait une série, et ton curseur une autre.
    Il te suffirait ensuite de modifier la série correspondant au curseur et ainsi tu n'aurais pas à redessiner ton spectre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 39
    Par défaut
    Malheureusement j'ai comme contrainte l'utilisation de Borland 1, ce qui réduit sérieusement le nombre de composants que j'ai à disposition ; TChart fait partie des composants dont je ne peux pas me servir ... : / (merci tout de même pour ta réponse )

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Bonjour,

    Il me semble que le plus simple à faire serait d'utiliser le mode de dessin Xor.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TPaintBox *Test = new TPaintBox(this);
    Test->Canvas->Pen->Mode = pmXor;
    Tu n'auras qu'à redessiner le curseur une deuxième fois à la même position pour l'effacer, puis le dessiner à sa nouvelle position.

    Benjamin

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 39
    Par défaut
    Parfait ! c'est exactement ça ! merci beaucoup !

  6. #6
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Dommage que tu ne puisses pas utiliser TChart car cela t'aurais facilité les choses.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 39
    Par défaut
    Ouais je sais bien mais malheureusement impossible de porter l'appli vers un builder plus récent, le link ne passe pas, la nouvelle version a des problèmes de symboles non résolus (alors que tout fonctionne bien dans la version présente).

  8. #8
    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 !

    Il existe aussi une autre possibilité en jouant avec un sprite.
    Un sprite peut se composer de deux bitmaps :
    - l'un pour mémoriser l'arrière plan sur lequel il se dessine
    - l'autre pour se représenter lui-même

    Au départ :

    - le sprite mémorise l'arrière plan
    - puis il se dessine

    La séquence pour la progression est alors :

    - le sprite restaure l'arrière plan
    - il mémorise le nouvel arrière plan
    - puis il se dessine

    On peut imaginer d'autres systèmes, comme par exemple à l'aide d'un pixel intelligent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class jPixel
    {
    TPoint Pos;
    TColor Color;
    TColor BackGround;
        //Pour le positionner une première fois
        void __fastcall Init(int X, int Y, TCanvas *Canvas);
        //Pour le déplacer les fois d'après
        void __fastcall Drag(int X, int Y, TCanvas *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
     
    void __fastcall jSprite::Init(int X, int Y, TCanvas *Canvas)
    {
    Pos = Point(X,Y);
    BackGround = Canvas->Pixels[X][Y];
    Canvas->Pixels[X][Y] = Color; 
    }
     
    void __fastcall jSprite::Drag(int X, int Y, TCanvas *Canvas)
    {
    Canvas->Pixels[Pos.x][Pos.y] = BackGround;
    Pos = Point(X,Y);
    BackGround = Canvas->Pixels[X][Y];
    Canvas->Pixels[X][Y] = Color; 
    }
    C'est juste pour le fun (parce que ça demande à être fortement optimisé)!

    A plus !

Discussions similaires

  1. Dessiner sur la barre de titre d'une autre application
    Par petitprince dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/10/2007, 17h29
  2. Réponses: 1
    Dernier message: 04/09/2007, 19h08

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