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 tr�s 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
    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

  2. #2
    Membre chevronn� Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    669
    D�tails du profil
    Informations personnelles :
    �ge : 60

    Informations forums :
    Inscription : Novembre 2004
    Messages : 669
    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++

  3. #3
    Membre tr�s 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
    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

  4. #4
    Membre tr�s 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
    Par d�faut
    WM_SCROLL n'est pas reconnu, faut-il rajouter un #include <quelquechose.h> ?

  5. #5
    Membre �prouv�
    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
    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 chevronn� Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    669
    D�tails du profil
    Informations personnelles :
    �ge : 60

    Informations forums :
    Inscription : Novembre 2004
    Messages : 669
    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++

  7. #7
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 tr�s 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
    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

  9. #9
    Membre tr�s 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
    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 !

  10. #10
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 tr�s 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
    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

+ 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