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 créée dynamiquement


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut TPaintBox créée dynamiquement
    Bonjour,
    Je cherche à dessiner dans une TPaintBox par dessus une TImage.
    Si je crée ma TPaintBox dans l'IDE, pas de problème...
    En revanche, si je la crée dynamiquement comme suit, j'ai une erreur de type
    "Control has no parent window !".
    Comment créer cette TPaintWindow ? (Voir les trois essais infructueux)

    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
     
    void __fastcall TFenPrincipale::SpeedButtonAddPointClick(TObject *Sender)
    {
    double X, Y;
    X=XLSLabelLongitude->Caption.ToDouble();
    Y=XLSLabelLatitude->Caption.ToDouble();
     
     // Essai 1 //   TPaintBox *Test = (TPaintBox *) Sender;
     // Essai 2 //   TPaintBox *Test = new TPaintBox((TPaintBox *) Sender);
     // Essai 3 //   TPaintBox *Test = new TPaintBox(this);
     
     Test->Canvas->Brush->Color = clRed;
     Test->Canvas->Pen->Color =  clBlack;
     Test->Canvas->Ellipse(0, 0, 20, 20);
     Test->Parent=FenPrincipale;  // Ne change rien non plus...
     Test->Repaint();
     
    etc.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut,

    En faite, on doit redéfinir la méthode OnPaint du PaintBox, car quand on lit l'aide de BCB, voici ce que ca dit :

    Citation Envoyé par Aide BCB
    si un gestionnaire d'événement OnPaint n'est pas fourni ou si aucun dessin n'est réalisé dans le gestionnaire d'événement, la boîte à peindre ne s'affiche pas sur la fiche à l'exécution.
    Voici le code que j'ai donc fait :

    Dans le .h, je rajoute ceci (partie public) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall Repeindre(TObject *Sender);
    Et voici le code .cpp:

    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 __fastcall TForm1::Repeindre(TObject *Sender)
    {
      TPaintBox *MonPaintBox = (TPaintBox*)Sender;
      MonPaintBox->Canvas->Brush->Color = clRed;
      MonPaintBox->Canvas->FillRect(Rect(0,0,MonPaintBox->Width,MonPaintBox->Height));
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TPaintBox *Test = new TPaintBox(Form1);
      Test->Parent = Form1;
      Test->Width = 100;
      Test->Height = 100;
      Test->Left = 150;
      Test->Top = 150;
      Test->OnPaint=Form1->Repeindre;
    }
    En espérant t'avoir aidé
    A+

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

    Depuis la méthode d'une fenêtre on peut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TPaintBox *PaintBox = new TPaintBox(this); //Tout TComponent dont ta fenêtre
    PaintBox->Parent = this; //Le TWinControl sur lequel le paintbox se dessine
    PaintBox->SetBounds(..., ..., ..., ...);
    S'il n'existe qu'une seule instance pour cette fenêtre (FenPrincipale) dans ce cas on peut remplacer le this :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TPaintBox *PaintBox = new TPaintBox(FenPrincipale);
    PaintBox->Parent = FenPrincipale;
    ...
    A noter que ce qui est dessiné sur un TPaintBox n'est pas persistant (en tout cas chez moi).
    Donc agir en conséquence... en particulier en tenant compte de ce qu'indique ero-sennin !

    On a même intérêt, je pense, à dériver de TPaintBox !

    A plus !

  4. #4
    Membre éclairé
    Profil pro
    lkjlgj
    Inscrit en
    Février 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : Angola

    Informations professionnelles :
    Activité : lkjlgj

    Informations forums :
    Inscription : Février 2007
    Messages : 255
    Par défaut
    Merci à ero-sennin et henderson !

    ero-sennin : ta méthode marche très bien. Le problème se situe effectivement
    au niveau de l'évènement OnPaint

    henderson : ayant à créer bcp de PaintBox, je vais probablement dériver de TPaintBox. J'étudie la question...des suggestions ?

    Une remarque : je constate qu'en dépit de l'argument du constructeur PaintBox (Fenetre), il faut quand même lui préciser explicitement un Parent=Fenetre !

    Merci !

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

    Les suggestions vont dépendre de ce qu'il y a à faire !
    Tout dépend en particulier de la finalité du programme (DAO, traitement d'image...).
    On peut très bien se retrouver dans un contexte où il n'y aurait plus aucune raison d'utiliser ni de TImage ni de TPaintBox, parce que ... une fenêtre et un bitmap peuvent suffire !
    Dans ton cas, je ne sais pas !!!

    Le propriétaire est du type TComponent et n'intervient que dans cette relation précise (le propriétaire détruit les composants qu'il détient).
    Le parent est du type TWinControl et intervient dans les mécanismes graphiques.

    La seule manière pour donner l'Owner comme Parent, d'un coup d'un seul, s'est de le faire dans le constructeur d'une classe dérivée. En fait, ça revient à lui donner un Parent par défaut (l'Owner lui-même s'il hérite de TWinControl) !

    A plus !

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

Discussions similaires

  1. [xslt]Comportement d'un noeud crée dynamiquement
    Par Capt. Flame dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 21/11/2005, 16h10
  2. Centrer un texte sur une image créée dynamiquement
    Par rigolman dans le forum Langage
    Réponses: 7
    Dernier message: 11/10/2005, 17h22
  3. Problèmes avec une TForm créée dynamiquement
    Par Pascal Jankowski dans le forum Composants VCL
    Réponses: 5
    Dernier message: 30/03/2005, 11h55
  4. Composant crée dynamiquement & Access in invalid memory
    Par Sunchaser dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/02/2005, 01h03
  5. Réponses: 5
    Dernier message: 12/07/2004, 21h00

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