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

 Delphi Discussion :

[D7] Problème de position du pointeur de la souris


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut [D7] Problème de position du pointeur de la souris
    Bonjour,

    je galère depuis un petit moment sur ce problème :

    je veux faire un zoom sur un Timage, en traçant un rectangle de sélection à la souris.

    Dans la petite appli de test jointe, à la première sélection (bouton gauche) tout se passe bien et ma partie d'image zoomée s'affiche bien.

    à la seconde sélection, la souris ne suit pas le coin inférieur droit du rectangle de sélection. Il y a un décalage et au relachement du bouton, le zoom s'affiche mal.

    J'ai vu que le problème vient de la fonction RetailleImage. Mais si je l'enlève, le zoom est déformé.

    Image3.zip

    Si quelqu'un a une idée ...

    Merci

    A+
    Charly

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TF_Image2.FormCreate(Sender: TObject);
    begin
      Image1.AutoSize := False ;
      Image1.Stretch := false ;
      FicSelec := ExtractFilePath(Application.ExeName)+'\cc_001833.jpg' ;
      jpg := TJpegImage.Create ;
    end;

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Alweber,

    oui, effectivement, cela résout le problème du pointeur de la souris, mais maintenant ce n'est plus la bonne partie d'image qui est recopiée à chaque zoom ...

    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    C'est sûrement Stretch qui change les coordonnées dans l'image et sa taille, mais je n'arrive pas à m'en sortir !

    A+
    Charly

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    C'est sûrement Stretch qui change les coordonnées dans l'image et sa taille, mais je n'arrive pas à m'en sortir !

    A+
    Charly
    Chez moi cela se passe bien. Je suis sous XE7

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Bien sûr que c'est ces stretch multiples qui posent problème.

    CopyRect fait déjà un stretch. A moins d'avoir un rectangle de sélection d'exactement le même rapport largeur/hauteur que l'image, CopyRect va la déformer (en hauteur ou en largeur).
    Tu retailles ensuite le TImage (en mode stretch) pour retomber sur tes pieds mais ce n'est que de l'affichage, derrière le bitmap est toujours déformé et un pixel-écran ne correspond plus à un pixel-bitmap. Ton dessin basé sur la position de la souris est dans les choux.

    Tu devrais travailler sur un bitmap en mémoire.

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Ok Andnotor, je vais travailler sur un bitmap en mémoire.

    Mais j'ai trouvé une solution boiteuse. Si je fais :

    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
    { ========================================================================== }
    procedure TF_Image2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    // Efface le rectangle de sélection et redessine l'image zoomée
    Var
      R1 : TRect ;
      R2 : TRect ;
    begin
      if (Button = mbLEFT) then
        Begin
          DessineRECT;
          R1 := MakeRect(PtDepart, PtArrivee) ;
          R2 := Retaille(R1, Image1.BoundsRect) ;
          Image1.Stretch := False ;
          RetailleImage(R2) ;
          image1.Canvas.CopyRect(image1.ClientRect, image1.Canvas, R1);
          CentrerImage ;
          FSelecting := False ;
        End ;
    end;
    { ========================================================================== }
    ça marche impeccable !

    je vais essayer toutefois une solution plus propre ...

    Merci

    A+
    Charly

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    J'ai fait ceci. Est ce que c'est correct ?

    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
    { ========================================================================== }
    procedure TF_Image2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    // Efface le rectangle de sélection et redessine l'image zoomée
    Var
      R1 : TRect ;
      R2 : TRect ;
      Bmp  : TBitMap ;
      Bmp2 : TBitMap ;
    begin
      if (Button = mbLeft) then
        Begin
          DessineRECT;
          R1 := MakeRect(PtDepart, PtArrivee) ;
          R2 := Retaille(R1, Image1.BoundsRect) ;
          Bmp := TBitmap.Create;
          Bmp2 := TBitmap.Create;
          Try
            Bmp.Assign(Image1.Picture.Graphic);
            Bmp2.Width := R2.Right - R2.Left ;
            Bmp2.Height := R2.Bottom - R2.Top ;
            Bmp2.Canvas.CopyRect(Bmp2.Canvas.ClipRect, Bmp.Canvas, R1);
            Image1.Picture := Nil ;
            Image1.Height := Bmp2.Height ;
            Image1.Width := Bmp2.Width ;
            Image1.Canvas.Draw(0, 0, Bmp2);
            CentrerImage ;
          Finally
            Bmp.Free;
            Bmp2.Free;
          End ;
     
        End ;
    end;
    { ========================================================================== }
    Maintenant, il faut que je modifie, car au fur et à mesure des zoom, l'image est de plus en plus petite !

    A+
    Charly

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour,

    je suis arrivé à une solution satisfaisante. L'image zoomée conserve la taille de l'image originale et les proportions sont conservées. La nouvelle fonction de calcul due rectangle de sélection RetailleSel et un peu fouillis, mais bon, ça marche.

    Voici les fonctions à intégrer dans l'appli des test :

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    procedure TF_Image2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    // Efface le rectangle de sélection et redessine l'image zoomée
    Var
      R1 : TRect ;   //  Rectangle de sélection
      R2 : TRect ;       //  Rectangle de sélection adapté aux dimensions de Image1
      Bmp  : TBitMap ;
      Bmp2 : TBitMap ;
    begin
      if (Button = mbLeft) then
        Begin
          DessineRECT;
          R1 := MakeRect(PtDepart, PtArrivee) ;
          PtDepart := R1.TopLeft ;
          PtArrivee := R1.BottomRight ;
          R1 := RetailleSel(R1, Image1.BoundsRect) ;
          R2 := Image1.BoundsRect ;
          Bmp := TBitmap.Create;
          Bmp2 := TBitmap.Create;
          Try
            Bmp.Assign(Image1.Picture.Graphic);
            Bmp2.Width := R2.Right - R2.Left ;
            Bmp2.Height := R2.Bottom - R2.Top ;
            Bmp2.Canvas.CopyRect(Bmp2.Canvas.ClipRect, Bmp.Canvas, R1);
            Image1.Picture := Nil ;
            Image1.Height := Bmp2.Height ;
            Image1.Width := Bmp2.Width ;
            Image1.Canvas.Draw(0, 0, Bmp2);
            CentrerImage ;
            FSelecting := False ;
          Finally
            Bmp.Free;
            Bmp2.Free;
          End ;
        End ;
    end;
    { ========================================================================== }
    Function TF_Image2.RetailleSel(R1, R2 : TRect): TRect;
    // R1 rectangle de sélection  R2 Rectangle de Image1
    // Retaille R1 pour être proportionnel à R2 et
    //  modifie PtDepart et PtArrivee pour rester dans R2
    //  PtDepart et PtArrivee ==> Rect resultat
    Var
      W1, H1, W2, H2 : Integer ;
      W, H : Integer ; // Dimensions du nouveau rectangle de sélection R
      Y : Real ;
      R, RP : Real ;
      DX, DY : Integer ;
    Begin
      W1 := R1.Right - R1.Left ;
      H1 := R1.Bottom - R1.Top ;
      W2 := R2.Right - R2.Left ;
      H2 := R2.Bottom - R2.Top ;
      R := W2 / W1 ;
      RP := H2 / H1 ;
      W := W1 ;
      H := H1 ;
      If R <= RP Then
        Begin
          // Expansion de R1 dans Image1 suivant W
          H := Round(H2 * W1 / W2) ;
          W := W1 ;
          DY := Round((H - H1) / 2) ;
     
          If (PtDepart.Y -DY) < 0 Then
            Begin
              // Rectangle trop haut
              PtDepart.Y := 0 ;
              PtArrivee.Y := H ;
            End
          Else
            Begin
              If (PtArrivee.Y + DY) > H2 Then
                Begin
                  // Rectangle trop bas
                  PtArrivee.Y := H2 ;
                  PtDepart.Y := H2 - H ;
                End
              Else
                Begin
                  // Rectangle contenu dans Image1
                  PtDepart.Y := PtDepart.Y - DY ;
                  PtArrivee.Y := PtArrivee.Y + DY ;
                End ;
            End ;
        End
      Else
        Begin
          // Expansion de R1 dans Image1 suivant H
          W := Round(W2 * H1 / H2) ;
          H := H1 ;
          DX := Round((W - W1) / 2) ;
          If (PtDepart.X -DX) < 0 Then
            Begin
              // Rectangle trop à gauche
              PtDepart.X := 0 ;
              PtArrivee.X := W ;
            End
          Else
            Begin
              If (PtArrivee.X + DX) > W2 Then
                Begin
                  // Rectangle trop à droite
                  PtArrivee.X := W2 ;
                  PtDepart.X := W2 - W ;
                End
              Else
                Begin
                  // Rectangle contenu dans Image1
                  PtDepart.X := PtDepart.X - DX ;
                  PtArrivee.X := PtArrivee.X + DX ;
                End ;
            End ;
        End ;
      Result := Rect(PtDepart.x,PtDepart.Y, PtArrivee.X,PtArrivee.Y) ;
    End ;
    { ========================================================================== }
    A+
    Charly

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

Discussions similaires

  1. [XL-2007] Définir la Position du Pointeur de la Souris à l'ouverture d'un UserForm
    Par Zygomatic dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 14/08/2017, 23h23
  2. Réponses: 2
    Dernier message: 06/02/2006, 23h15
  3. [CSS][debutant] problème de position de 2 div dans un div
    Par nixonne dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 06/12/2005, 14h12
  4. [C#]Drag & Drop, problème de position de la souris
    Par debug dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/10/2005, 13h06
  5. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20

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