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 :

Dessiner sur un composant sans Canvas


Sujet :

C++Builder

  1. #1
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut Dessiner sur un composant sans Canvas
    Bonjour,
    je souhaiterais dessiner sur un TShape, le problème est que le Shape n'as pas de Canvas, et donc je ne sais pas comment faire.

    J'avais trouvé une méthode de recopie de Canvas dans un TPanel (composant également sans Canvas) mais je ne le trouve plus.

    Si quelqun à une idée, merci.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    L'aide sur TShape me dit que ça descend d'une TGraphicControl, elle a donc un TCanvas mais en protected.

    Pour y accéder il te suffit donc d'écrire ton propre composant qui descend de TShape. D'ailleurs tous les composants graphiques de la VCL utilisent un TCanvas, en tout cas tous ceux qui descendent de TGraphicControl :

    Citation Envoyé par Aide Borland
    Propriétés héritées de Controls::TGraphicControlPropriété Description
    Canvas (protected) Fournit la surface de dessin utilisée par le contrôle graphique.
    Neilos

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

    Comme l'indique Neilos, en créant un nouveau composant dérivant de TShape.
    Il est possible de surcharger la méthode Paint.
    Le Canvas hérité de TGraphicControl est alors accessible dans le scope de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class jShape : public TShape
    {
    public :
        __fastcall jShape(TComponent *Owner);
        __fastcall ~jShape();
        void __fastcall Paint(); //surcharge de Paint
    };

    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
    __fastcall jShape::jShape(TComponent *Owner)
        : TShape(Owner)
    {
    if(Owner->InheritsFrom(__classid(TWinControl))) Parent = (TWinControl*)Owner;
    Shape = stCircle;
    Brush->Style = bsSolid;
    Brush->Color = clYellow;
    Pen->Style = psSolid;
    Pen->Color = clBlack;
    Pen->Mode = pmCopy;
    SetBounds(20,20,100,100);
    }
     
     
    void __fastcall jShape::Paint()
    {
    TShape::Paint(); // pour réaliser le fond
    Canvas->Brush->Style = bsClear;
    Canvas->TextOut(8,8, "Hello !");
    }
    A plus !

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    En fait, cette question découle de la réalisation d'un TPopupMenu avec une zone de saisie.

    Est il possible de créer un composant dérivé du PopupMenu et d'ajouter un item de saisie type TEdit ?

  5. #5
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    henderson, j'ai essayé ton code et j'ai créé le jShape de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jShape *essai = new jShape(this);
    mais j'ai une erreur de lieur, il a fallu que je supprime la déclaration __fastcall ~jShape(); sinon c'est impec, merci

    Je laisse le poste ouvert le temps de répondre à mon autre question. Au passage, je lis les tutos pour apprendre à créer des composants.

  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 !

    Il existe aussi une autre possiblité en rédéclarant une propriété TCanvas :
    Sur les bases de ce que j'ai donné, et c'est juste un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class jShape : public TShape
    {
    protected :
        TCanvas *__fastcall GetCanvas();
    public :
        __fastcall jShape(TComponent *Owner);
        __fastcall ~jShape();
        void __fastcall Paint();
        __property TCanvas *Canvas ={read=GetCanvas};
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TCanvas *__fastcall jShape::GetCanvas()
    {
    return (TShape::Canvas); // pour éviter d'entrer en circularité
    }
    A l'usage si jShape *Shape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormClick(TObject *Sender)
    {
    Shape->Canvas->TextOut(30,30,"Click");
    }
    Pour le PopupMenu c'est un autre débat il me semble !
    A ce sujet, je pense qu'il faut créer un objet dont l'apparence et le comportement seront ceux d'un TPopupMenu.
    En dérivant de TCustomControl... et en gérant OnExit ... Il faudrait rédiger et tester...

    A plus !

  7. #7
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Je te remercie, j'ai créé un composant dérivé du TShape, comme Neilos et toi l'avez conseillé et j'ai ajouté le code pour récupérer le Canvas comme sur ton dernier exemple. Ca marche impeccable .

    Merci bien messieurs pour ces explications.
    Je pense que je vais m'attaquer maintenant au PopupMenu avec un Edit dedans, dès que j'aurais un peu de temps. C'est une autre histoire...

    Merci encore

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

Discussions similaires

  1. Dessiner sur un Jpeg sans perte de qualité
    Par poly128 dans le forum Langage
    Réponses: 3
    Dernier message: 03/09/2007, 21h35
  2. [SWING]Dessiner sur un composant
    Par Tarteens dans le forum AWT/Swing
    Réponses: 22
    Dernier message: 02/07/2007, 10h50
  3. Dessiner sur un composant sans Canvas
    Par josse95 dans le forum C++Builder
    Réponses: 10
    Dernier message: 31/03/2007, 19h01
  4. dessiner sur un composant picturebox
    Par xantares dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 03/01/2007, 12h05
  5. Comment dessiner sur un Bitmap sans scintillement ?
    Par TOTO32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/01/2005, 10h11

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