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 :

Graphisme rectangle de sélection sur TImage


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 Graphisme rectangle de sélection sur TImage
    Bonjour,

    Mon problème est de traçer un rectangle de sélection sur un TImage.
    J'ai trouvé des routines qui utilisent des fonctions Windows telles que :
    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
     
    procedure TForm1.RemoveTheRect;
    var
      R : TRect;
    begin
      R := NormalizeRect(Rect(MaskRect.TopLeft.X,MaskRect.TopLeft.Y,MaskRect.BottomRight.X,MaskRect.BottomRight.Y));  // Rectangle might be flipped
      InflateRect(R,1,1);                     // Make the rectangle 1 pixel larger
      InvalidateRect(Handle,@R,True);         // Mark the area as invalid
      InflateRect(R,-2,-2);                   // Now shrink the rectangle 2 pixels
      ValidateRect(Handle,@R);                // And validate this new rectangle.
      // This leaves a 2 pixel band all the way around
      // the rectangle that will be erased & redrawn
      UpdateWindow(Handle);
    end;
     
    procedure TForm1.DrawTheRect;
    begin
      // Determines starting pixel color of Rect
      Counter := CounterStart;
      // Use LineDDA to draw each of the 4 edges of the rectangle
      LineDDA(MaskRect.TopLeft.X,MaskRect.TopLeft.Y,MaskRect.BottomRight.X,MaskRect.TopLeft.Y,@MovingDots,LongInt(Canvas));
      LineDDA(MaskRect.BottomRight.X,MaskRect.TopLeft.Y,MaskRect.BottomRight.X,MaskRect.BottomRight.Y,@MovingDots,LongInt(Canvas));
      LineDDA(MaskRect.BottomRight.X,MaskRect.BottomRight.Y,MaskRect.TopLeft.X,MaskRect.BottomRight.Y,@MovingDots,LongInt(Canvas));
      LineDDA(MaskRect.TopLeft.X,MaskRect.BottomRight.Y,MaskRect.TopLeft.X,MaskRect.TopLeft.Y,@MovingDots,LongInt(Canvas));
    end;
    Ces routines sont appelées à partir des évenements OnMouseDown et OnMouseMove d'un TImge

    Le problème est simple :

    Si TImage se trouve directement sur TForm cette routine marche sans problème.

    Si TImage se trouve sur un TPanel lui même sur TForm elle ne marche plus !

    Quelqu'un sait-il pourquoi ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Cela ne fonctionne donc jamais, puisque tu as toujours un TForm, derrière ...

    Sinon, si tu dois faire un Rectangle de selection, pourquoi ne pas superposer deux Timages l'un sur l'autre, en transparence ... je sais c'est moyen, mais cela évite de modifier l'autre image, et de devoir gérer un XOR sur le trait de selection ...

  3. #3
    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 J'avoue ne pas comprendre
    Quand tu dis "Cela ne fonctionne donc jamais..." c'est pas tout à fait vrai puisque ca marche sans le TPanel entre le TImage et le TForm.

    Dans l'application que je développe le TPanel est incontournable !

    N'y a t'il vraiment pas moyen de faire fonctionner cette routine sur un TImage qui se trouve sur un TPanel lui-même sur un TForm ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Oups, j'ai mal lu, ...

    En fait, tu manipule la forme en direct avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvalidateRect(Handle, ...)
    c'est le Handle de la fenêtre, remplace cela par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvalidateRect(Image.Parent.Handle)
    de même pour

    c'est comme faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..., LongInt(Self.Canvas));
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..., LongInt(Form1.Canvas));
    remplace par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..., LongInt(Image.Canvas));
    parfois, je me demande si le Self implicite n'est pas une difficulté pour la compréhension ...

  5. #5
    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 Ca ne marcha pas tout à fait correctement
    Le rectangle se dessine mais ne s'efface pas ! = > Clignotement et sétie de rectangles les uns dans les autres

    Voici le source de l'effacement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.RemoveTheRect;
    var
      R : TRect;
    begin
      R := NormalizeRect(Rect(MaskRect.TopLeft.X,MaskRect.TopLeft.Y,MaskRect.BottomRight.X,MaskRect.BottomRight.Y));  // Rectangle might be flipped
      InflateRect(R,1,1);                     // Make the rectangle 1 pixel larger
      InvalidateRect(Image1.Parent.Handle,@R,True);         // Mark the area as invalid
      InflateRect(R,-2,-2);                   // Now shrink the rectangle 2 pixels
      ValidateRect(Image1.Parent.Handle,@R);                // And validate this new rectangle.
      // This leaves a 2 pixel band all the way around
      // the rectangle that will be erased & redrawn
      UpdateWindow(Image1.Parent.Handle);
    end;
    Qu'est-ce qui cloche ?

  6. #6
    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
    c'est bien compliqué pour un simple rectangle sur un Timage...
    Dessine ton rectangle à la souris dans le canvas d'un bitmap et utilise copymode pour combiner le canvas de ton timage avec celui du bitmap.
    j'avais répondu à l'équivaent d'un stabilo jaune sur un timage avec un post il y a quelque temps. Le principe est le même...
    fais une recherche...

  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

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Tu peux trouver ici : http://www.developpez.net/forums/sho...71#post2980971
    dans mon message d'aujourd'hui (22/02/2008, 12h46) un code allégé qui permet de tracer/effacer un Rectangle de sélection dans le canvas d'un TImage.

    A+

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

Discussions similaires

  1. [Graphisme][Débutant(e)] Problème sur repaint()
    Par Katyucha dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 08/10/2004, 17h12
  2. [Info]Rectangles de sélection : logiciel de dessin ?
    Par rozwel dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 27/03/2004, 17h49
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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