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

Langage Delphi Discussion :

Image avec ascenseurs ou curseur "Main"


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Image avec ascenseurs ou curseur "Main"
    Bonjour,

    Je cherche, sous D2007, comment placer dans un composant Timage de dimensions constantes et définies une image Tbitmap de dimensions supérieures en conservant sa taille originale avec la possibilité de déplacer la partie visible du TBitmap dans TImage soit avec des ascenceurs horizontal et vertical soit (je préfèrerais) avec un curseur Main.

    En fait c'est la même fonction qui est utilisée dans Mappy.com pour les cartes géographiques de dimensions supérieures à celles de la fenêtre d'affichage.

    Un petit exemple de code serait le bienvenu.

    Merci à tous

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut
    Pourquoi ne pas utiliser un ScrollBox avec ton TImage dedans
    Tu auras ainsi les ascensseurs de la ScrollBox a ta disposition

    Pour ce qui est de la main de deplacement, Il te suffit de deplacer tob TImage en lui faisant suivre les mouvements de ta souris, dans ce cas tu mettras Autoscroll a false sur le scrollBox. Petit plus pour evité que l'utilisateur ne sorte definitivement l'image sous tu code quelque ligne pour interdire l'image d'aller trop loin soit tu bloque la souris dans la zone client de ScrollBNox jusqu'a ce que la souris sot relachée (MouseUp)

    Voila comment je procederais a toi de voir
    A++
    Qwaz

    [Edit]
    Tu met une scrollbox avec la propriete Autoscroll a false
    dedans un panel avec la propriete AutoSize a true
    et dans les Panel un TImage avec la propriete Autosize a true egalement
    DoubleBuffered c'est pour evité les flash de rafraichissement essais sans tu verras.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Panel1.DoubleBuffered := true;
    end;
     
    procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
          ReleaseCapture;
          SendMessage(Panel1.Handle, WM_SYSCOMMAND, $F012, 0);
     
    end;

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Je viens de tenter ça. J'ai testé rapidement , ça colle.
    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
     
     private
        { Déclarations privées }
        xo,yo:integer;
        permission:boolean;
        centre:Tpoint;
        bitmap:Tbitmap;
        procedure deplacer;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    centre:=point(image1.clientwidth div 2,image1.ClientHeight div 2);
    bitmap:=Tbitmap.Create;
     
    with bitmap do begin
    width:=image1.ClientWidth;
    height:=image1.ClientHeight;
    loadfromfile('cheminbitmap.bmp');
    end;
    image1.Canvas.Draw(centre.X-bitmap.Width div 2,centre.Y-bitmap.Height div 2,bitmap);
    end;
     
    procedure Tform1.deplacer;
    begin
    image1.Canvas.Draw(centre.X-bitmap.Width div 2,centre.Y-bitmap.Height div 2,bitmap);
    end;
     
     
     
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    permission:=true;
    xo:=x;
    yo:=y;
    end;
     
    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    centre:=point(x-xo,y-yo);
    if permission then deplacer;
    end;
     
    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    permission:=false;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    bitmap.Free;
    application.Terminate;
    end;
     
    :D a+
     
    end.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok C'est sympa
    Gros merci, tu me dépanne...
    Mais j'essairai demain... Ce soir à force de chercher je ne vois plus très clair

  5. #5
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    ceci dit, ce serait mieux de l'afficher dans une paintbox, tu as l'évenement on paint,ce serait tout de même plus propre.
    faire un draw dans le on create...c'est pas top.
    ou plutôt, charger ton bmp dans un timage de la dimension de ton image et
    et faire un paintbox.canvas.draw de image.picture.bitmap.
    comme ça par exemple:

    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
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
    paintbox1.Canvas.draw(u,v,image1.Picture.Bitmap);
    end;
     
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    xs:=x;
    ys:=y;
    permission:=true;
    screen.Cursor:=crhandpoint;
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    if permission then begin
    u:=x-xs;
    v:=y-ys;
    paintbox1paint(self);
    end;
    end;
     
    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    permission:=false;
    screen.Cursor:=crdefault;
    end;
    à toi de limiter les déplacements de souris pour que l'image reste toujours dans le cadre de la paintbox.

    ps: tu charges ton bitmap dans ton timage et tu mets le timage.visible à false.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut L'algo avec une paintbox est pas mal du tout
    Mais j'ai encore un petit problème :

    Quand avec le curseur on entraine l'image en diagonale de bas en haut, si le bas de l'image n'est pas visible à cause d'une très grande différence de taille entre l'image et le paintbox, on ne peut pas placer le curseur dans coin bas droit pour doubler le parcours réalisé à la première manip car des que l'on clique une nouvelle fois sur l'image celle ci se remet dans la position originale qu'elle avait dans le paintbox...

    Une petite correction doit être suffisante mais je ne la trouve pas !!! Mais merci quand même c'est du bon boulot qui sera parfait avec la petite correction demandée...

  7. #7
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    excuse, je pense qu'il faut que tu intégres la dernière position du Timage.

    Dans l'événement onmousemouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    u:=x+xf-xo;
    v:=y+xf-xo;
    dans le onmouseup :
    normalement tu devrais repartir de la dernière position et pas de la position de départ ! J'ai pas testé mais c'est logique.
    a+

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Navré
    Ca ne marche pas

  9. #9
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    je refais le code et je regarde... je ne l'ai enregistré...

  10. #10
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    tiens:

    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
     
     private
        { Déclarations privées }
        u,v,xs,ys,uf,vf:integer;
        permission:boolean;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
    paintbox1.Canvas.draw(u,v,image1.Picture.Bitmap);
    end;
     
     
    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    permission:=false;
    screen.Cursor:=crdefault;
    uf:=u;
    vf:=v;
     
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    if permission then begin
    u:=uf+x-xs;
    v:=vf+y-ys;
    paintbox1paint(self);
    end;
    end;
     
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    permission:=true;
    xs:=x;
    ys:=y;
    end;
     
    end.
    moi, c'est bon.

  11. #11
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut
    Post #2, ca ne faisait pas la meme chose avec 10 fois moins de ligne de code ?
    a++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  12. #12
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    excuse Qwazerty, je n'ai pas regardé ton code vu que c'était pas ma question...
    J'ai proposé ce qui me venait.
    Le problème, c'est qu'il veut du clé en main..
    a +

  13. #13
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut

    Ca n'etait pas a ton egard, chacun donne des solutions c normal mais l'auteur de la question pourais au moins prend le temps de regarder ce qu'on lui propose
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #14
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    En plus, ça à l'air intéressant et plus rapide... un doublebuffered pour éviter de faire son propre buffer..., je note

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Mille excuses
    Je vais regarder ta dernière solution, mais n'ayant pas eu encore tout à fait entièrement la solution que j'attendais à mon problème je cherchais de mon côté, c'est normal ! Quand j'ai trouvé une solution sur le Net correspondant exactement à ce que je cherchais... Ensuite c'est dimanche et j'ai eu des obligations familiales... Je t'ai donc planté je le reconnais de façon asez peu élégante (voir mal polie).

    Pour le reste il n'y a pas lieu de se vexer. J'admire, autant que je l'apprécie, cette assistance généreuse autant que bénévole (et sacrement efficace) que fournissent les forumeurs de developpez.com à toutes heures du jour, même de nuit, et de la semaine, même le dimanche !

    Je reprend le problème demain et, promis, j'essairai ta dernière solution et te ferai part du résultat. A première vue les deux solutions sont très proches, l'une utilise un panel l'autre une paintbox, mais la gestion des onmousemove, onmousdown etc. sont presque identiques (le paintbox est même plus adapté), tu avais donc parfaitement finalisé la solution, il me reste en effet le devoir se l'apprécier et de tenir au courant.

    Donc à demain et j'espère sans rancune.

  16. #16
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    c'est moi qui dois m'excusé c'est autre chose qui m'avais beaucoup agacé et qui n'a rien a voir avec ce forum....
    Enfin si la solution que tu as trouvé te convient tant mieux
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok Ca marche très bien
    Bonjour,

    Je viens d'essayer ta dernière solution, elle marche très bien. C'est même celle que je vais utiliser, car l'autre me pause des problèmes de dépassement de pile vu que l'algo s'applique sur des images photo de 10 mégapixels.

    Encore une fois mille merci

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

Discussions similaires

  1. [Toutes versions] image avec ascenseurs
    Par Oh!Tofocus dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/02/2010, 22h23
  2. [WinDev 9] Image avec ascenseur
    Par Romanops dans le forum WinDev
    Réponses: 3
    Dernier message: 28/09/2006, 08h47

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