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 :

Bouger dans un Timage


Sujet :

C++Builder

  1. #1
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut Bouger dans un Timage
    Bonjour, j'ai une image grand format qui s'affiche dans un TImage, et donc deux ascensseurs sont présent sur les cotés, un vertical un horizontal.

    Est-ce qu'il est possible de les bouger non pas manuellement, mais par programmation ?

    J'ai cherché dans le Image1-> et Image1->Picture mais je n'ai trouvé aucune commande.

    Quelqu'un as-t-il une astuce ?

    Merci
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  2. #2
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    Bonjour

    pas tres bien compris la question, mais je me lance.

    Est-ce qu'il est possible de les bouger non pas manuellement, mais par programmation ?
    Par programation ?
    Avec les fleches du clavier, avec un TButton, ??

    Voici une commande qui fait descendre le scrollbar d'un TRichEdit
    tout en bas, A adapter avec le control des deux ascensseurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SendMessage(RichEdit1->Handle, WM_SCROLL, SB_BOTTOM, 0);
    A++
    .
    Why
    .
    //------------------

  3. #3
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    haa SendMessage() ... je connais pas ca, c'est certainement la solution.

    En fait comme dans un TMemo, il y a un ascensseur sur la droite pour faire défiler en vertical et un en bas pour le défilement horizontal.

    Sur les TImage c'est pareil, et je voudrais pouvoir le faire bouger avec la souris en cliquant sur l'image et en maintenant appuyer ( c'est bien plus pratique que d'utiliser les ascenseurs ).

    Je vais regarder la commande SendMessage(Image1->Handle, WM_SCROLL, qq chose pour faire descendre ou monter un peu, 0); plus en détail et voir si c'est possible.

    Merci de ton aide
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  4. #4
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    WM_SCROLL n'est pas reconnu, faut-il rajouter un #include <quelquechose.h> ?
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  5. #5
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    et ca te dirai une TScrollBox ... c'est pratique ... c'est facile ... et ca peut t'éviter des tas de recherches inutiles ...

  6. #6
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    Rebonjour

    Excuse pour l'erreur, c'est WM_VSCROLL pour descendre et WM_TOP pour remonter, etc..
    regarde dans l'aide builder en tapant WM_VSCROLL.

    A++
    .
    Why
    .
    //------------------

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Tu peux aussi créer un objet dérivant d'un autre objet de la VCL en lui apportant des
    fontionnalités propres.
    TGraphicControl est une classe très intéressante puisque que l'objet se dessine lui-même,
    le moment venu. Il suffit de surcharger sa méthode Paint et d'y développer de quoi copier
    dans sa propre zone client une partie d'une image d'un autre objet.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class jGraphicControl : public TGraphicControl
    {
    private :
    Graphics::TBitmap *Image;
    public :
    TPoint HotPoint; //point dans le bitmap Image à partir du quel on va copier
        __fastcall jGraphicControl(TComponent *Owner);
        __fastcall ~jGraphicControl(); 
        void __fastcall Paint();
        void __fastcall LoadFromFile(AnsiString A);
     
    };
    A toi de développer les méthodes, si cela te convient !

    On peut aussi dériver de TCustomControl... Le bestiaire est vaste !

    A plus !

  8. #8
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    J'ai essayé SendMessage( Image1->Canvas->Handle,WM_VSCROLL, SB_LINEUP, 0); ou avec SB_autre_chose mais rien ne se passe, je crois que sur les TImage ca ne doit pas marcher ?

    Concernant la TScrollBox, je n'ai jamais utilisé, j'ai essayé de faire un ScrollBox1->Brush->Bitmap->LoadFromFile("d:\\test.bmp"); mais je fais tout planter en faisant ca
    Comment faire pour faire un copier coller de mon bitmap présent dans un TImage vers cette fameuse ScrollBox ?

    pour la réponse de henderson, ca m'a l'air intéressant aussi mais comment utilise-t-on cette classe modifiée concrètement ?
    J'ai un gros problème de compréhension du fonctionnement des classes je crois.

    En tout ca merci pour vos réponses, c'est sympa
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  9. #9
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    SendMessage( Form1->Handle,WM_VSCROLL, SB_LINEDOWN , 0);

    Ca marche, les ascensseurs sont sur Form1 et pas sur l'image comme je le croyais au départ.

    Je peux naviguer comme je veux, c'est super

    Je laisse en non-résolu encore un peu si vous avez la réponse pour le ScrollBox, ca m'intéresse quand meme.

    Merci pour votre aide à tous !
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Voici pour donner suite à ma suggestion...
    J'ai rajouté quelques propriétés et méthodes pour le fun...
    C'est un simple exemple :

    Voici la classe (.h):

    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
    class jGraphicControl : public TGraphicControl
    {
    private :
    Graphics::TBitmap *Bitmap;
    Graphics::TBitmap *Image;
    TPoint HotPoint;
    bool IsMoving;
    TPoint Move_xy;
    public :
        __fastcall jGraphicControl(TComponent *Owner);
        __fastcall ~jGraphicControl();
        void __fastcall Paint();
        void __fastcall LoadFromFile(AnsiString A);
        void __fastcall AbsoluteMove(int X, int Y);
        void __fastcall RelativeMove(int X, int Y);
     
        //Méthodes événementielles de la souris
        //que l'on peut mettre en oeuvre de cette façon
        void __fastcall MseDown(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y);
        void __fastcall MseMove(TObject *Sender, TShiftState Shift,
              int X, int Y);
        void __fastcall MseUp(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y);
    };
    Comme on peut le voir, j'ai rajouté un bitmap pour une question, chez moi, de scintillements.
    (Ca dépend de la version BCB, ici j'ai développé avec BCB3 Pro)
    Eventuellement, on peut supprimer ce bitmap, et dessiner directement dans l'objet via
    son canvas...

    Voici maintenant les méthodes (.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
    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
    96
    97
    98
    99
    __fastcall jGraphicControl::jGraphicControl(TComponent *Owner)
        : TGraphicControl(Owner)
    {
    if(Owner->InheritsFrom(__classid (TWinControl))) Parent = (TWinControl*)Owner;
    Bitmap = new Graphics::TBitmap;
    Image = NULL; //tant qu'on n'a pas chargé d'image
    IsMoving = false;
    OnMouseDown = MseDown;
    OnMouseMove = MseMove;
    OnMouseUp = MseUp;
    }
     
    __fastcall jGraphicControl::~jGraphicControl()
    {
    if(Image != NULL) delete Image; Image = NULL;
    delete Bitmap;
    }
     
     
    void __fastcall jGraphicControl::Paint()
    {
    if(Image != NULL)
        {
        if(Bitmap->Width != Width) Bitmap->Width = Width;
        if(Bitmap->Height != Height) Bitmap->Height = Height;
        Bitmap->Canvas->Brush->Color = Parent->Brush->Color;
        Bitmap->Canvas->FillRect(Rect(0,0,Width, Height));
        TRect Dest = Rect(0,0,Width, Height);
        TRect Srce = Rect(HotPoint.x,
                          HotPoint.y,
                          HotPoint.x + Width,
                          HotPoint.y + Height);
        Bitmap->Canvas->CopyRect(Dest, Image->Canvas, Srce);
        Canvas->Draw(0,0,Bitmap);
        }
    else
        {
        Canvas->Brush->Style = bsClear;
        Canvas->Pen->Color = clBlack;
        Canvas->Pen->Mode = pmCopy;
        Canvas->Pen->Style = psDashDot;
        Canvas->Rectangle(0,0,Width, Height);
        }
    }
     
    void __fastcall jGraphicControl::LoadFromFile(AnsiString A)
    {
    if(FileExists(A))
        {
        if(Image == NULL) Image = new Graphics::TBitmap;
        Image->LoadFromFile(A);
        HotPoint = Point(0,0);
        Paint();
        }
    else
        {
        ShowMessage("Fichier image introuvable");
        }
    }
     
    void __fastcall jGraphicControl::AbsoluteMove(int X, int Y)
    {
    HotPoint = Point(X,Y);
    Paint();
    }
     
     
    void __fastcall jGraphicControl::RelativeMove(int X, int Y)
    {
    HotPoint = Point(HotPoint.x - X, HotPoint.y - Y);
    Paint();
    }
     
     
    //Je rajoute ces 3 méthodes, juste pour le fun. Elles vont permettre
    //à l'utilisateur de faire bouger l'image avec la souris (drag)
     
    void __fastcall jGraphicControl::MseDown(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y)
    {
    IsMoving = true;
    Move_xy = Point(X,Y);
    }
     
    void __fastcall jGraphicControl::MseMove(TObject *Sender, TShiftState Shift,
              int X, int Y)
    {
    if(IsMoving)
        {
        RelativeMove(X - Move_xy.x, Y - Move_xy.y);
        Move_xy = Point(X,Y);
        }
    }
     
    void __fastcall jGraphicControl::MseUp(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y)
    {
    IsMoving = false;
    }
    Comme il s'agit ici d'une simple classe et non d'un composant, voici comment ça se
    passe sur l'unité (.cpp) qui va l'utiliser :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Déclaration globale
    jGraphicControl *Image;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Contructeur de TForm1
    __fastcall TForm1::TForm1(TComponent* Owner) 
        : TForm(Owner)
    {
    OpenDialog1->InitialDir = ExtractFilePath(Application->ExeName);
     
    Image = new jGraphicControl(this); //je crée l'objet ici
    Image->SetBounds(20,20,200,200); //et je le positionne sur la fiche
    }
    J'ai donc utilisé un Menu et un OpenDialog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void __fastcall TForm1::Open1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
        {
        Image->LoadFromFile(OpenDialog1->FileName);
        }
    }
    Pour le mouvement de l'image, il suffit donc simplement de sollicter les méthodes
    dont le but est de positionner le HotPoint soit de manière absolue, soit de manière
    relative (dans le sens conventionnel du drag) :

    Image->AbsoluteMove(X, Y)
    Image->RelativeMove(+ou- X, +ou- Y)


    A noter que l'objet utilise la RelativeMove pour son propre traitement du déplacement
    de l'image à l'aide de la souris.

    A plus en espérant que cela puisse t'aider, d'une manière ou d'une autre !

  11. #11
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    J'ai travaillé un peu dessus cette nuit et je suis arrivé à un très bon résultat avec un TImage que je place à l'intérieur d'une ScrollBox, et je bouge en utilisant la méthode du SendMessage

    Le mouvement est parfaitement fluide, aucun clignotement de l'image.

    Ta solution me semble pas mal du tout aussi, je vais essayer ça dans la journée et comparer les deux méthode ca peut être intéressant.

    Merci beaucoup à tous en tout ca
    Désolé, on savait pas que c'était impossible, alors on l'a fait

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

Discussions similaires

  1. EInvalidGraphic sur chargement d'un jpeg dans un TImage
    Par tomtom7 dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/02/2007, 12h54
  2. Garder la proportionalité de l'image dans un TImage
    Par Bourak dans le forum Composants VCL
    Réponses: 1
    Dernier message: 28/10/2005, 15h03
  3. Ecrire du texte selon un angle dans un TImage
    Par kem dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/10/2005, 09h40
  4. Pb affichage du canvas dans une TImage
    Par Tango dans le forum Composants VCL
    Réponses: 28
    Dernier message: 11/10/2005, 13h57
  5. Image en mosaique dans un TImage
    Par Maitre Dragon dans le forum C++Builder
    Réponses: 6
    Dernier message: 31/07/2004, 13h18

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