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 417
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 417
    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