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 :

Avec une photo 1024x768 créer zone pour action


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut Avec une photo 1024x768 créer zone pour action
    Bonjour à toutes et à tous,

    Je place un Timage sur ma fiche, je place une image et je met sa propriété strech à true comme cela elle s'affiche sur tout l'écran (résolution 1024x768).

    Cette image, représente une dizaine de carrés 25x25 et j'aimerai pouvoir créer une zone sur chaque image en vue d'une action.

    Le problème à mon avis, se posera lors d'une résolution différente de l'écran.

    Y a t'il un moyen d'encrer les 10 zones créées ?

    En mettant à false toutes les propriétés Anchors, cela fonctionne sauf qu'en cas d'agrandissement, la zone devient plus petite au milieu du carré.

    Merci de votre aide.

    @+,

    Cincap

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    par un simple calcul :

    image d'origine = 250x250 (soit 10x10 carré de 25x25)

    donc
    taille de zone = 25x25;

    taille de zone "stretch" = Width/10 par Height/10

    si on passe de 250x250 à 1024x768 :
    rapport Zone/Taille :
    zone width = 1024 / 10 = 102.4 (102)
    zone height = 768 / 10 = 76.8 (77)

    pour savoir ou est la souris sur l'image :

    zone index X = MouseX div 102
    zone index Y = MouseY div 77

    exemple :
    mouse X,Y = 512, 384
    alors
    zone X = 512 div 102 = 5
    zone Y = 384 div 77 = 5

    mouse X, Y = 256, 192
    alors
    zone X = 256 div 102 = 3
    zone Y = 192 div 77 = 3
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Dr.Who, merci de ta réponse.

    En fait pour le moment j'ai créer avec un TLabel transparent mes petits carrés de 25x25 et j'ai mis tout à false dans la propriété "Anchors".

    Cela fonctionne correctement si je définis au départ la résolution de mon écran.

    Maintenant, je ne vois pas comment adapter ta logique.

    @+,

    Cincap

    P.s, je n'ai toujours pas de résultat pour mon topic adapter une animation sur 2 écrans, le problème c'est que je ne sais pas tester directement puisque je n'ai qu'un seul écran.

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    imaginons un image : 250x250 avec 10x10 zones

    l'image est modifiée et la taille finale sera donc inconnue.

    mais par calcul, on peu retrouver au dessus de quelle zone le curseur de souris est, ou encore les coordonnées X,Y de chaque zones.

    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
    118
    119
    120
    121
    unit Unit9;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm9 = class(TForm)
        PaintBox1: TPaintBox;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
      private
        fDesktopScreen : TBitmap;
      public
        { Déclarations publiques }
      end;
     
    var
      Form9: TForm9;
     
    implementation
     
    {$R *.dfm}
     
    var
      R : TRect;
      WR, HR, MX, MY : integer;
     
    procedure GetDesktopScreenShot(BMP: TBitmap);
    var
      Buffer : TBitmap;
    begin
      Buffer := TBitmap.Create;
      try
        Buffer.Width       := Screen.Width;
        Buffer.Height      := Screen.Height;
        Buffer.PixelFormat := pf32bit;
     
        BitBlt(Buffer.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
               GetDC(GetDesktopWindow), 0, 0, SRCCOPY);
     
        BMP.Assign(Buffer);
      finally
        Buffer.Free;
      end;
    end;
     
    procedure TForm9.FormCreate(Sender: TObject);
    begin
      DoubleBuffered := true;
     
      fDesktopScreen := TBitmap.Create;
      GetDesktopScreenShot(fDesktopScreen);
    end;
     
    procedure TForm9.FormDestroy(Sender: TObject);
    begin
      fDesktopScreen.Free;
    end;
     
    procedure TForm9.FormResize(Sender: TObject);
    begin
      // calcul des dimensions des zones 
      WR := PaintBox1.Width div 10;
      HR := PaintBox1.Height div 10;
      PaintBox1.Invalidate;
    end;
     
    procedure TForm9.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      // dans quelle zone est le curseur ?
      MX := X div WR;
      MY := Y div HR;
      caption := format('%d x %d',[MX, MY]);
      PaintBox1.Invalidate;
    end;
     
    procedure TForm9.PaintBox1Paint(Sender: TObject);
    begin
      if assigned(fDesktopScreen) then
      begin
        // dessin de l'image redimensionée
        SetStretchBltMode(PaintBox1.Canvas.Handle, HALFTONE);
        StretchBlt(PaintBox1.Canvas.Handle, 0, 0, PaintBox1.Width, PaintBox1.Height,
                   fDesktopScreen.Canvas.Handle, 0, 0, fDesktopScreen.Width, fDesktopScreen.Height,
                   SRCCOPY);
     
        PaintBox1.Canvas.Brush.Style := bsClear;
        PaintBox1.Canvas.Pen.Color   := clRed;
     
        // s'assure d'être dans l'image
        if MX < 0 then
          MX := 0
        else
        if MX > PaintBox1.Width then
          MX := PaintBox1.Width;
     
        if MY < 0 then
          MY := 0
        else
        if MY > PaintBox1.Height then
          MY := PaintBox1.Height;
     
        // calcul de la zone à afficher
        R.Left   := MX * WR;
        R.Top    := MY * HR;
        R.Right  := R.Left + WR;
        R.Bottom := R.Top  + HR;
     
        // dessin de la zone
        PaintBox1.Canvas.Rectangle(R);
      end;
     
    end;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 421
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 421
    Points : 1 325
    Points
    1 325
    Par défaut
    @ Dr.Who, En fait la photo de 1024x768, représente sur fond de couleur une série de carrés de couleurs qui ne sont pas alignés les uns par rapport aux autres, alors je ne vois pas comment on peux dire que la souris se trouve sur tel carré.

    Sinon avec la propriété Anchors, j'ai un bon résultat en forcant les dimensions de mon image à 1024x768.

    @+,

    Cincap

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    haaa d'accord! tu avais omis ce details, ou mal exposé.

    toujours avec la même méthode, de façon plus ou moins fiable.
    mais nécéssite de connaitre la position d'origine de chaque carré.

    sinon, tu peux te lancer dans une analyse de l'imagece qui sera bien sur plus complexe.

    mais par simple calcul, si par exemple le carré est en position :
    Left = 59
    Top = 64
    Right = 109
    Bottom = 114
    (soit un carré de 50x50)

    WR (single) = taille d'origine W / nouvelle taille W
    WH (single) = taille d'origine H / nouvelle taille H

    et la position du carré :
    Left = round(Left * WR)
    Top = round(Top * HR)
    Right = round(Right * WR)
    Bottom = round(Bottom * HR)


    code:
    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
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    unit Unit9;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm9 = class(TForm)
        PaintBox1: TPaintBox;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
      private
        fImageOrigine : TBitmap;
      public
        { Déclarations publiques }
      end;
     
    var
      Form9: TForm9;
     
    implementation
     
    {$R *.dfm}
     
    var
      ROrigine : TRect;
      RNouveau : TRect;
      ROver    : boolean = false;
      WR, HR   : single;
     
    // crée une image lambda
    procedure GetImage(BMP: TBitmap);
    var
      Buffer : TBitmap;
    begin
      Buffer := TBitmap.Create;
      try
        Buffer.Width       := 640;
        Buffer.Height      := 480;
        Buffer.PixelFormat := pf32bit;
     
        Buffer.Canvas.Brush.Color := clBlue;
        Buffer.Canvas.Pen.Color   := clBlue;
     
        ROrigine.Left   := 120;
        ROrigine.Top    := 256;
        ROrigine.Right  := 170;
        ROrigine.Bottom := 306;
     
        Buffer.Canvas.Rectangle(ROrigine);
     
        BMP.Assign(Buffer);
      finally
        Buffer.Free;
      end;
    end;
     
    procedure TForm9.FormCreate(Sender: TObject);
    begin
      DoubleBuffered := true;
     
      fImageOrigine := TBitmap.Create;
      GetImage(fImageOrigine);
    end;
     
    procedure TForm9.FormDestroy(Sender: TObject);
    begin
      fImageOrigine.Free;
    end;
     
    procedure TForm9.FormResize(Sender: TObject);
    begin
      // calcul du nouveau rapport hauteur x largeur
      WR := PaintBox1.Width / fImageOrigine.Width;
      HR := PaintBox1.Height / fimageOrigine.Height;
     
      // localisation et taille de la zone d'origine
      RNouveau.Left   := round(ROrigine.Left * WR);
      RNouveau.Top    := round(ROrigine.Top * HR);
      RNouveau.Right  := round(ROrigine.Right * WR);
      RNouveau.Bottom := round(ROrigine.Bottom * HR);
     
      // redéssine
      PaintBox1.Invalidate;
    end;
     
    procedure TForm9.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      // est-ce que le curseur est dans la nouvelle zone ?
      ROver := ((X >= RNouveau.Left) and (X <= RNouveau.Right)) and
               ((Y >= RNouveau.Top) and (Y <= RNouveau.Bottom));
     
      PaintBox1.Invalidate;
    end;
     
    procedure TForm9.PaintBox1Paint(Sender: TObject);
    begin
      // si l'image est assigné
      if assigned(fImageOrigine) then
      begin
        // on séléctionne le mode stretch dit "doux"
        SetStretchBltMode(PaintBox1.Canvas.Handle, HALFTONE);
     
        // déssine l'image d'origine aux dimension de la paintbox
        StretchBlt(PaintBox1.Canvas.Handle, 0, 0, PaintBox1.Width, PaintBox1.Height,
                   fImageOrigine.Canvas.Handle, 0, 0, fImageOrigine.Width, fImageOrigine.Height,
                   SRCCOPY);
     
        PaintBox1.Canvas.Brush.Style := bsClear;
        // couleur de la zone
        if ROver then
        begin
          // si survolée = rouge
          PaintBox1.Canvas.Pen.Color := clRed;
          PaintBox1.Canvas.Pen.Style := psSolid;
        end
        else
        begin
          // sinon = grisé
          PaintBox1.Canvas.Pen.Color := clGray;
          PaintBox1.Canvas.Pen.Style := psDot;
        end;
     
        // mets en évidence la zone
        PaintBox1.Canvas.Rectangle(RNouveau.Left-2, RNouveau.Top-2, RNouveau.Right+2, RNouveau.Bottom+2);
      end;
     
    end;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2012, 16h31
  2. Probleme avec une requete sql dans VB6 pour un champ date
    Par jacko842 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2009, 08h31
  3. [AJAX] Appeller une page php en Ajax pour action sur Mysql
    Par Overstone dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 20/07/2007, 18h23
  4. Réponses: 15
    Dernier message: 24/01/2007, 12h54
  5. [VB]lancer un éditeur graphique AVEC une photo jointe
    Par verdi dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/02/2006, 16h45

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