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 :

lier 2 Timage


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Par défaut lier 2 Timage
    j'ai 2 Timage (position variable) je veux les connecter par un arc.
    j'ai créé un paintbox car je crée les images sur un panel et j'ai couvert ce dernier par le paintbox et je l'ai mis en arrière plan.
    j'ai pas trouvé les coordonnés des timages pour pouvoir tracer une ligne à l'aide du canvas

    Merci pour votre aide précieuse

  2. #2
    Membre émérite
    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
    Par défaut
    Salut,
    Voici un petit exemple de ce que tu peux faire pour relier tes images.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         TPoint points[3];
         points[0] = Point(Button1->Left+Button1->Width,Button1->Top);
         points[1] = Point((Button2->Left+(Button1->Left+Button1->Width))/2,Button1->Top/2);
         points[2] = Point(Button2->Left,Button2->Top);
         Form1->Canvas->Pen->Width = 2;
         Form1->Canvas->PolyBezier(points,3);
    Ici, j'ai relié deux boutons d'une form et j'ai travaillé avec le Canvas de la Form. C'est aussi simple et rapide. J'ai utilisé la méthode pour tracer une courbe de Bézier.
    3 points suffisent: les coins de tes images et un point intermédiaire et le tour et joué.

    Si la méthode te convien, à toi de remplacer les boutons pas des images

  3. #3
    Membre confirmé Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Par défaut
    c'est ce que j'ai fais mais ça marche pour des images fixes dont on connait leur positiond'avance.
    mon problème mes images sont créées d'une manière dynamiques puis déplacées donc je ne connais pas leurs positions. :cry:

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Par défaut
    tu veux connaitre les coordonnée de ton image?

    Image1->Left (te donne la position de l'image horizontalement)
    Image1->Top (te donne la position de l'image verticalement)

    et tu peux au moment de la creation de ton image dynamiquement faire

    Image1->Left=valeur1;
    Image1->Top=valeur2;

    Comme ca tu placera ton image la ou tu veux

  5. #5
    Membre confirmé Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Par défaut
    je ne fixe pas les coordonnées lors de la créations.
    l'utilisateur pourra déplacer l'images comme il veut.
    moi je dois récupérer les nouveaux coodonnées de mes images.
    en plus j'aimerai selectionner les deux images pour définir les point de départ et le point d'arrivée de l'arc.

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 34
    Par défaut
    ben je t'ai dis

    les proprietes Left et Top te donnent les coordonnées de ton image

  7. #7
    Membre émérite
    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
    Par défaut
    Re
    Il te suffira de refaire le liens dès que l'image est déplacée. Voilà un bout de code où les deux boutons peuvent être déplacés en faisant un "cliquer/glisser" sur chacun des boutons. Tu verras que le liens est refait à chaque fois après nettoyage de l'écran pour ne pas voir tous les anciens traits.
    en variable globale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool Press1 = false;
    bool Press2 = false;
    TPoint coord1,coord2;
    TRect rect;
    et les évennements:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    //------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
        rect.Left   = 0;
        rect.Top    = 0;
        rect.Right  = Form1->Width;
        rect.Bottom = Form1->Height;
    }
    //------------------------------------------------------------------------
    void __fastcall TForm1::Button1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       Press1 = true;
       coord1.x=X;
       coord1.y=Y;
    }
    //------------------------------------------------------------------------
    void __fastcall TForm1::Button1MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       Press1 = false;
    }
    //------------------------------------------------------------------------
    void __fastcall TForm1::Button1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
     
      if(Press1)
      {
         static bool unefois;
         unefois = !unefois;
         if(!unefois)
         {
             Button1->Top  += Y-coord1.y;
             Button1->Left += X-coord1.x;
         }
         coord1.x=X;
         coord1.y=Y;
     
         Form1->Canvas->FillRect(rect);
     
         TPoint points[3];
         points[0] = Point(Button1->Left+Button1->Width,Button1->Top);
         points[1] = Point((Button2->Left+(Button1->Left+Button1->Width))/2,Button1->Top/2);
         points[2] = Point(Button2->Left,Button2->Top);
         Form1->Canvas->Pen->Width = 3;
     
         Form1->Canvas->MoveTo(Button2->Left,Button2->Top);
         Form1->Canvas->PolyBezier(points,3);
      }
    }
    //------------------------------------------------------------------------
    void __fastcall TForm1::Button2MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       Press2 = true;
       coord2.x=X;
       coord2.y=Y;
    }
    //------------------------------------------------------------------------
    void __fastcall TForm1::Button2MouseUp(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
       Press2 = false;
    }
    //------------------------------------------------------------------------
    void __fastcall TForm1::Button2MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
      static bool unefois;
      if(Press2)
      {
         unefois = !unefois;
         if(!unefois)
         {
             Button2->Top  -= coord2.y-Y;
             Button2->Left -= coord2.x-X;
         }
         coord2.y=Y;
         coord2.x=X;
     
         TPoint points[3];
         points[0] = Point(Button1->Left+Button1->Width,Button1->Top);
         points[1] = Point((Button2->Left+(Button1->Left+Button1->Width))/2,Button1->Top/2);
         points[2] = Point(Button2->Left,Button2->Top);
         Form1->Canvas->Pen->Width = 3;
     
         Form1->Canvas->FillRect(rect);
         Form1->Canvas->MoveTo(Button2->Left,Button2->Top);
         Form1->Canvas->PolyBezier(points,3);
      }
    }
    //------------------------------------------------------------------------
    il y a surement plus simple, mais c'est pour te montrer le principe. Tu fais les actions suivantes à chaque mouvement d'une image.

    1)Tu nettoyes ta Form
    2)Tu redessines tous tes liens (pour être sûr)

    ici je me place sur le mouvement du curseur de la souris.

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

    Pour avoir effectivement un lien entre deux objets, surtout au niveau dynamique, il faut pouvoir le mémoriser.
    On peut utiliser le Tag d'un TImage pour y associer un deuxième TImage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TImage *Target;
    TImage *Image;
    Le cast pour affecter un TImage au Tag
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image->Tag = (int)Target;
    Pour le dessin, on aura ainsi toutes les facilités pour dessiner quelque chose entre ces deux images.
    La récupération des positions des images (left, top, right, bottom) se fait à l'aide de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TRect I = Image->BoundsRect;
    TImage *Target = (TImage*)Image->Tag;
    if(Target != NULL)
        {
        TRect T = Target->BoundsRect;
        //Il suffit d'utiliser les primitives de TCanvas
        //Et de dessiner sur tout objet disposant d'un Canvas
        //il suffit de s'appuyer sur les valeurs des 2 TRect
        }
    Probablement qu'ici, on comprendra mieux l'avantage d'utiliser une TList pour pouvoir traiter tous les liens...

    C'est un moyen rudimentaire qui, bien exploité, peut donner de bons résultats (selon que...)!

    A plus !

  9. #9
    Membre confirmé Avatar de bhahmed
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Par défaut
    il faut ajouté cette^procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void lier (void) {
    Form1->PaintBox1->Refresh();
    for (int i =0; i<eq; i++) {
            for (int j=0; j<eq;j++) {
                    if (link [i][j] >=1) {
                            Form1->PaintBox1->Canvas->Pen->Width = link [i][j];
                            Form1->PaintBox1->Canvas->MoveTo(Image[i]->Left+Image[i]->Width/2,Image[i]->Top+Image[i]->Height/2 );
                            Form1->PaintBox1->Canvas->LineTo(Image[j]->Left+Image[j]->Width/2,Image[j]->Top+Image[j]->Height/2 );
     
                     }
            }
    }
    }
    puis faire l'appel danns le mouseup comme suit :

    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
    void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    TImage *Image = (TImage*)Sender;
    if (imageDownButton == 0) {
            MoveFlag = false;
            lier();
            Application->ProcessMessages();
    } else {
            link [chosenVehicule][Image->Tag] = 1;
            link [Image->Tag][chosenVehicule] = 1;
            lier();
    }
     
    }

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

Discussions similaires

  1. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 11h38
  2. [TImage] Transfert de Picture par pixels.
    Par H2D dans le forum Langage
    Réponses: 9
    Dernier message: 25/10/2003, 14h37
  3. vider un timage
    Par gIch dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/08/2002, 23h58
  4. TImage
    Par Thylia dans le forum C++Builder
    Réponses: 5
    Dernier message: 09/07/2002, 20h03
  5. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36

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