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 :

Aide: Canvas et AutoSize


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut Aide: Canvas et AutoSize
    Voila mon problème, lorsque je dessine sur une forme grâce au Canvas, et qu'àprès je mets la propriété AutoSize de ma form a True, le dessin obtenu grâce au Canvas disparaît. Existe t il un moyen pour vérouiller le dessin afin qu'il ne disparaisse plus?

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

    Personnellement, j'ai une version BCB qui doit dater puisque je n'ai pas de
    propriété AutoSize dans la class TForm (form???).

    Sans doute TImage ?

    Par contre, dessiner directement sur une form à l'aide du canvas... ça ne peut
    pas être persistant sauf si tu utilises un bitmap dans lequel tu dessines et que
    tu dessines (le bitmap) ensuite dans la OnPaint de la Form. C'est vrai aussi pour un TPaintBox.

    Celà dit on peut dessiner directement dans la OnPaint si on ne veut pas utiliser de bitmap !

    Il faudrait savoir sur quoi tu dessines !

    A plus !

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Voila en gros à qoui consiste mon projet:
    Je dois dessiner des arbres 234, pour cela je créé une TForm dynamiquement où j'affiche mes noeuds selon leur place. Jusqu'à là pas de problèmes.
    La difficulté vient lorsque je veux desssiner les liaisons père-fils. Pour cela j'ai créé un tableau d'entiers qui contient les coordoonées de départ et d'arriver de chaque lien (tableau préalablement rempli lors du placement des noeuds). Puis je créé une fonction qui lit le tableau et dessine les liens grâce au Canvas (propriétées Moveto et LineTo) , la fonction est ensuite définie comme la fonction OnPaint de ma Form puis elle est appellée.
    Grâce à ce procédé j'obtient un bel arbre 234, mais voila, la taille de ma form ne correspond pas vraimetn avec l'arbre, car elle est calculée pour afficher un abre 234 complet (dont tous les niveaux sont remplies avec le max de noeuds). Il faut donc rèajuster la taille, lorsque j'applique la propriété Autosize à True, la fenêtre se réajuste bien mais les lignes dessinées par le Canvas ont disparues. Voilà le problème

  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 créé une TForm dynamiquement
    Donc as-tu affecté à l'événement OnPaint de cette Form une méthode
    permettant de dessiner l'arbre ?

    Voir éventuellement dans sa OnResize... en y faisant un Repaint() ce
    qui obligerait la form à redessiner toute sa zone client.

    Je ne dispose pas de la propriété AutoSize pour une TForm... snif !

    A plus !

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Oui, Pour dessiner l'arbre, j'utilise le OnPaint de ma TForm.
    Peux tu plus expliquer ta méthode ? (j'avoue que j'ai pas très bien saisi)
    Sinon je viens de vérifier dans Borland C++ Builder il y a bien un AutoSize pour les TForm :p

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

    J'ai BCB3 Pro et je n'ai pas de propriété AutoSize pour TForm. Celà existe bien chez moi,
    mais pour TImage et qui consiste à faire correspondre les dimensions visuelles du TImage
    à celles de son bitmap. En d'autres termes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Image->Width = Image->Picture->Bitmap->Width; 
    Image->Height = Image->Picture->Bitmap->Height;
    Avec ma version BCB, pour tout ce qui est graphisme direct sur une form, je passe par un
    bitmap sur lequel je réalise le dessin. Ca fait gagner énormément au niveau temps d'exécution.
    Lorsque le travail sur ce bitmap est terminé, il suffit de dessiner ce bitmap dans la zone
    client de la form.

    La séquence ressemble toujours à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void __fastcall TForm1::DrawBitmap() //déclaré en public dans la class de TForm1
    {
    if(Bitmap != NULL)
        {
        //On actualise les dimensions, en cas d'un resize de la form
        ...
        //On fait ce qu'il y a à faire sur le bitmap
        ...
        //On dessine le bitmap dans la zone client de la form
        Canvas->Draw(0,0,Bitmap);
        }
    }
    Et j'ai donc invariablement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormPaint(TObject *Sender)//OnPaint
    {
    DrawBitmap();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormResize(TObject *Sender)//OnResize
    {
    DrawBitmap();
    }
    Sur les versions ultérieures de BCB, il me semble que l'on a un canvas logique
    et un canvas physique...(double buffered ???) voir peut-être de ce coté là au sens
    où le dessin est bien présent dans l'écran logique mais n'est pas répercuté sur
    l'écran physique (sauf bien sûr si je confond ATARI et PC !).

    A plus !

  7. #7
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    Je crois que AutoSize se renseigne plutôt à la création de la fenêtre mais je constate que ça ne marche que par rapport à des composants qui sont mis sur la fenêtre et non par rapport à une surface de travail.

    Si vous mettez AutoSize = true à la création, la fenêtre aura la plus petite dimension au départ. Si sur la fenêtre vous avez par exemple un PaintBox et que vous modifiez la zone client de ce PaintBox, la fenêtre restera de la même dimension. Mais si par exemple vous mettez un bouton et que vous déplaciez ce bouton, là la fenêtre modifiera ses dimensions en fonction de la nouvelle position du bouton.

    Ce que je ferais pour ma part s'agissant d'une surface de dessin, c'est de ne pas toucher à AutoSize, donc le laisser à false par défaut, et de modifier par programme les propriétés ClientWidth et ClientHeight de le fenêtre quand c'est nécessaire. là, ça marchera.

    À bientôt
    Gilles

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Mais dans ce cas la comment faire bouger le côté gauche ou droit ?
    Vu que je dois recadrer la Form, il me faut agir sur ces deux côtés.
    En tout cas merci pour vos réponses.

  9. #9
    Membre Expert
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Par défaut
    C'est à vous à recentrer le dessin et à en calculer à chaque modification les coordonnées maximales e.g. max_x_ et max _y. À partir de là, à chaque fois que l'un des maximums bouge, vous avez une mise à jour de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClientWidth=max_x;
    ClientHeight=max_y;
    À bientôt
    Gilles

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

Discussions similaires

  1. Dessiner des lignes à l'aide d'un Canvas
    Par combe_6 dans le forum Composants graphiques
    Réponses: 7
    Dernier message: 16/12/2014, 17h01
  2. Tracer une courbe en J2ME à l'aide d'un canvas
    Par hicham13000 dans le forum Graphisme
    Réponses: 1
    Dernier message: 27/12/2010, 00h30
  3. Demande aide pour evenement sur widget Canvas
    Par prolog22000 dans le forum Tkinter
    Réponses: 10
    Dernier message: 19/03/2010, 06h34
  4. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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