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 :

TCanvas dans un TPanel


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2004
    Messages : 35
    Par défaut TCanvas dans un TPanel
    Chers tous,

    j'ai un formulaire comprenant plusieurs TPanel (alignés sur alClient).
    Un de ces tpanel (nommé PanCompare) comprend un autre TPanel (alTop) et un TPaintBox(aligné sur alClient, nommé Painting).

    Je mets ce panel en avant-plan dans le formulaire puis et je voudrais "dessiner" sur le canvas du TPaintBox, sur base du contenu d'un TList:

    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
    void __fastcall TForm1::Button1Click(TSender *Sender)
    {
    PanCompare->BringToFront();
    Draw();
    }
     
    void __fastcall TForm1 :: Draw()
    {
        int i;
        CWayAssistantObjectToDraw *r;
        Painting->Invalidate();
        for (i=0; i<m_lControls->Count; i++)
                {
                r=(CWayAssistantObjectToDraw *)m_lControls->Items[i];
                r->Draw(Painting->Canvas);
                }
    }
    dans le .h, section protected, il y a:
    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
    TList *m_lControls;
        class CWayAssistantObjectToDraw
            {
            public:
               TPoint x,y;
               AnsiString sText;
               char cType;
               TColor Color;
               void Draw(TCanvas *c)
                    {
                    if (cType=='L') // trace une ligne
                        {
                        c->Pen->Color=Color;
                        c->MoveTo(x.x, x.y);
                        c->LineTo(y.x, y.y);
                        }
                    else               // écrit un texte
                        {
                        c->Font->Color=Color;
                        c->TextOut(x.x,x.y, sText);
                        }
                    }
            };
    *********************************************
    Malheureusement:

    En mode debug, je vois qu'il fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     c->Pen->Color=cbBlack;
    c->MoveTo(10, 30);
    c->LineTo(100, 150);
    et aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c->Font->Color=clRed;
    c->TextOut(10,10, "line 1");

    Mais RIEN n'est dessiné sur mon TPaintBox....
    Quelqu'un peut me dire pourquoi?

    Merci,
    Alain

  2. #2
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    J'ai un peu de mal à comprendre ce que tu fais. Mais je vois que tu n'as pas directement dessiner sur le Canvas de ta PaintBox.
    Je suis aussi entrain d'utiliser et de dessiner sur une paintbox.Pour cela, j'ai créé un TBitmap en globale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
    Ensuite une fonction :
    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
     
    void DrawBMP()
    {
      TCanvas *C =Bitmap->Canvas;
      if (cType=='L') // trace une ligne
      {
           c->Pen->Color=Color;
           c->MoveTo(x.x, x.y);
           c->LineTo(y.x, y.y);
      } else               // écrit un texte
      {
           c->Font->Color=Color;
           c->TextOut(x.x,x.y, sText);
       }
    Painting->Canvas->Draw(0,0,Bitmap);
    }
    Je ne sais pas trop si c'est cela que tu recherches.
    Bon courage

  3. #3
    Membre averti
    Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2004
    Messages : 35
    Par défaut ca ne marche pas!
    En fait, je dessine directement sur le canvas lors de l'appel: r->Draw(Painting->Canvas); (je passe le canvas en paramètre).
    Ta méthode ne change rien.
    Pour expliquer plus clairement: j'ai un TList m_lControls comprenant des objets à dessiner (textes ou lignes + positions).
    Je voudrais que la méthode Draw du formulaire me dessine le tout dans un TPaintBox.
    Pour comprendre le problème: cette méthode Draw est appelée deux fois pour dessiner à deux endroits:
    * sur le canvas inclus dans un tpanel sur le formulaire
    * sur le canvas d'un autre formulaire (TFPainting, comprenant un TPaintBox nommé TPainting).
    Résultat:
    il dessine correctement sur le canvas de l'autre formulaire (fPaint) et RIEN du tout sur le TPaintBox inclus dans un TPanel du formulaire courant.
    Why Why Why?
    Question subsidiaire: est-il possible d'avoir un scrollbar avec le TPaintObject et d'avoir une zone de dessin plus grande que ce qui est à l'écran?
    ****************************
    //code de la méthode draw:
    void __fastcall TFWayAssistant:raw()
    {
    int i;
    CWayAssistantObjectToDraw *r;
    Graphics::TBitmap *Bitmap;
    if (m_lControls)
    {
    Bitmap = new Graphics::TBitmap;
    TFPainting *fPaint=new TFPainting(this);
    for (i=0; i<m_lControls->Count; i++)
    {
    r=(CWayAssistantObjectToDraw *)m_lControls->Items[i];
    r->Draw(Bitmap->Canvas);
    r->Draw(fPaint->Painting->Canvas);
    }
    Painting->Canvas->Draw(0,0,Bitmap);
    delete Bitmap;
    }
    }
    **************************************

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

    Je pense qu'il faut utiliser l'événement OnPaint de ton TPaintBox.

    A) soit la méthode contiendra tout le code nécessaire au dessin.

    B) ou bien on dessine sur un bitmap qui est ensuite dessiné sur le TPaintBox, et ce dans une autre méthode.
    Dans ce cas, la OnPaint du TPaintBox ne contiendra que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Bitmap != NULL) PaintBox->Canvas->Draw(0,0,Bitmap);
    Dans les deux cas, le rafraichissement du TPaintBox se fera à l'aide de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PaintBox->Repaint(); // qui in fine sollicite la OnPaint
    Pour l'usage du bitmap :

    En global :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
    Dans le constructeur de la form (ou ailleurs... selon que...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bitmap->Width = PaintBox->Width;
    Bitmap->Height = PaintBox->Height;
    Dans la OnClose de la form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete Bitmap;
    Bitmap = NULL; // à cause d'éventuels problèmes lors de la fermeture du programme...
    A plus !

  5. #5
    Membre averti
    Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2004
    Messages : 35
    Par défaut merci!
    ca marche

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

Discussions similaires

  1. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30
  2. Mettre un TmainMenu dans un TPanel
    Par anarpunk dans le forum Langage
    Réponses: 6
    Dernier message: 19/02/2006, 22h09
  3. [Débutant] affichage opengl dans un TPanel
    Par minnit_s dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/01/2006, 23h03
  4. Comment utiliser OpenGL dans un TPanel ?
    Par PCMan dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/12/2005, 17h48
  5. affichage d'un plan issu d'une vidéo dans un tpanel
    Par gerardTar dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/07/2005, 16h11

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