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 :

TSprite indépendant de l'objet de font


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 14
    Points
    14
    Par défaut TSprite indépendant de l'objet de font
    Salut,

    j'ai fait une classe TTextSprite qui peux deplacer du text au coordonnees voulu sans affecter l'image en dessous.

    Ca fonctionne bien mais il ne fonctionne que sur un TPaintBox seulement.
    Je voudrait que ma classe fonctionne sur n'importequel objet ayant un canvas.( je veux quelle soit plus universelle)
    exemple : je veux pouvoir afficher sur unTImage, TBitMap ou TForm sans changer le code dans ma class.

    Comment faire ?

    Voici ma classe:

    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
    unit Sprites;
     
    interface
     
    uses
      Windows, SysUtils,Classes,Graphics,ExtCtrls;
    type
     
      TSpriteOrigin = (so00,so10,so11,so01);                                        //correspond au 4 point cartesient
     
     
      TTextSprite = Class
      private
        FSpriteOrigin : TSpriteOrigin;   //origine du point x,y  en bas a droit, en haut a gauche etc...
        FActive : Boolean;       
        RBG : TRect;             //Rect BackCround
        BG  : TBitMap;           //BackGround
        Target : TPaintBox;  <______C'EST ICI QUE JE VOUDRAIS UN VARIANT COMME OBJET
     
     
     
      public
        W,H : Integer;           //Dimention de l'espace que prend le text
        RFG : Trect;             //Rect ForeGround
        FG  : TBitMap;           //ForGround
        Constructor Create(Destination:TPaintbox);  <______    
        Destructor Destroy;
        procedure  Show(x, y: Integer;T:String);
        procedure  Hide;
        Procedure  DoActivate(Rep:Boolean);
        procedure SetSpriteOrigin(Origin: TSpriteOrigin);      
      published
      End;
    implementation
     
     
    Procedure TTextSprite.SetSpriteOrigin(Origin:TSpriteOrigin);
    Begin
      FSpriteOrigin := Origin;
    End;
     
    Procedure TTextSprite.DoActivate(Rep:Boolean);
    Begin
      if rep = false then begin
        rbg:= RECT(-100,-100,1,1);
        rfg:= RECT(-100,-100,1,1);
      end;
      FActive := Rep;
    End;
    Constructor TTextSprite.Create(Destination:TPaintBox); <______
    Begin
      Target := Destination;  //<______
      FG := TBitMap.Create;
      BG := TBitmap.Create;
     
      fg.Canvas.Font.name   := Target.Canvas.Font.name;  
      fg.Canvas.Font.size   := Target.Canvas.Font.Size;
      fg.Canvas.Font.Color  := Target.Canvas.Font.Color;
     
      fg.Canvas.Brush.Color := Target.Canvas.Brush.Color;
      fg.Canvas.Pen.Color   := Target.Canvas.Pen.Color;
      FActive := true;
      FSpriteOrigin := so00;                                                        //Par default set origine en haut a gauche (normale)
    End;
     
    Destructor TTextSprite.Destroy;
    begin
      FG.Free;
      BG.Free;
    end;
     
    Procedure TTextSprite.Show(x,y:Integer;T:String);
    Var TW : integer;
    Begin
      if not Factive then exit;
      W := FG.Canvas.TextWidth(T)+2;
      H := FG.Canvas.TextHeight(T)+2;
     
      case FSpriteOrigin of                                                         
      so01: Y := Y - H;
      so10: X := X - W;
      so11:
        Begin
          Y := Y - H;
          X := X - W;
        End;
      end;
     
      RBG := rect(x,y,x+w,y+h);
      RFG := RECT(0,0,w,h);
     
      bg.Width := w;
      bg.Height := h;
     
     bg.Canvas.CopyRect(RFG,Target.canvas,RBG);                           //Memorise l'image avant de dessiner
     
      FG.Width  :=w;
      FG.Height :=h;
      fg.canvas.Brush.Color := $f0f0f0;//clltgray;
      fg.Canvas.TextRect(RFG,0,0,t);
      Target.canvas.CopyRect(RBG,fg.Canvas ,RFG);
     
    End;
    Procedure TTextSprite.Hide;
    begin
      if FActive then
        Target.canvas.CopyRect(RBG,bg.Canvas ,rfg); //REPLACE L'IMAGE TARGET
    end;
     
    end.
     
    {
    exemple d'utilisation
     code Pour bouger le TextSprite
     Dans create form..
     1-ts:=TTextSprite.Create(PaintBox1);
       ts.fg.Canvas.Brush.Color:=rclred;
     
     ...
     
     Dans mouseMove
     ts.Hide;                                                                //Replacer l'image arriere
     ts.Show(x,y,'Coor :'+ Inttostr(x) +','+ inttostr(y));   //Memorise l'image arriere et affiche le TextSprite devant Limage arriere
     
    }


    Merci d'avance
    Madmax

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut et Bienvenue sur Developpez.com,

    Je ne suis pas trop calé dans ce genre de choses, mais je te propose une piste, c'est de travailler avec la classe TCanvas Ainsi, tu ne te limites pas à un objet. Tu peux faire en sorte d'utiliser tous objets qui possède un canevas ...

    Je mettrai donc ceci :
    Biensur, celà implique des changements dans le code car l'on travaille directement avec le canvas de l'objet et non plus avec l'objet ... Je ne sais pas si c'est bon (j'ai une erreur de violation d'accès dans le OnMouseMove lorsque je veux tester la classe comme tu l'as cité) mais ça donnerai un truc du genre :

    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
    unit Sprites;
     
    interface
     
    uses
      Windows, SysUtils,Classes,Graphics,Controls,ExtCtrls;
    type
     
      TSpriteOrigin = (so00,so10,so11,so01);                                        //correspond au 4 point cartesient
     
     
      TTextSprite = Class
      private
        FSpriteOrigin : TSpriteOrigin;   //origine du point x,y  en bas a droit, en haut a gauche etc...
        FActive : Boolean;       
        RBG : TRect;             //Rect BackCround
        BG  : TBitMap;           //BackGround
        Target : TCanvas;  // TCanvas
     
     
     
      public
        W,H : Integer;           //Dimention de l'espace que prend le text
        RFG : Trect;             //Rect ForeGround
        FG  : TBitMap;           //ForGround
        Constructor Create(Destination:TCanvas);
        Destructor Destroy;override;
        procedure  Show(x, y: Integer;T:String);
        procedure  Hide;
        Procedure  DoActivate(Rep:Boolean);
        procedure SetSpriteOrigin(Origin: TSpriteOrigin);      
      published
      End;
    implementation
     
     
    Procedure TTextSprite.SetSpriteOrigin(Origin:TSpriteOrigin);
    Begin
      FSpriteOrigin := Origin;
    End;
     
    Procedure TTextSprite.DoActivate(Rep:Boolean);
    Begin
      if rep = false then begin
        rbg:= RECT(-100,-100,1,1);
        rfg:= RECT(-100,-100,1,1);
      end;
      FActive := Rep;
    End;
    Constructor TTextSprite.Create(Destination:TCanvas);
    Begin
      Target:=Destination;
      FG := TBitMap.Create;
      BG := TBitmap.Create;
     
      fg.Canvas.Font.name   := Destination.Font.name;
      fg.Canvas.Font.size   := Destination.Font.Size;
      fg.Canvas.Font.Color  := Destination.Font.Color;
     
      fg.Canvas.Brush.Color := Destination.Brush.Color;
      fg.Canvas.Pen.Color   := Destination.Pen.Color;
      FActive := true;
      FSpriteOrigin := so00;                                                        //Par default set origine en haut a gauche (normale)
    End;
     
    Destructor TTextSprite.Destroy;
    begin
      FG.Free;
      BG.Free;
      inherited;
    end;
     
    Procedure TTextSprite.Show(x,y:Integer;T:String);
    Begin
      if not Factive then exit;
      W := FG.Canvas.TextWidth(T)+2;
      H := FG.Canvas.TextHeight(T)+2;
     
      case FSpriteOrigin of                                                         
      so01: Y := Y - H;
      so10: X := X - W;
      so11:
        Begin
          Y := Y - H;
          X := X - W;
        End;
      end;
     
      RBG := rect(x,y,x+w,y+h);
      RFG := RECT(0,0,w,h);
     
      bg.Width := w;
      bg.Height := h;
     
     bg.Canvas.CopyRect(RFG,Target,RBG);                           //Memorise l'image avant de dessiner
     
      FG.Width  :=w;
      FG.Height :=h;
      fg.canvas.Brush.Color := $f0f0f0;//clltgray;
      fg.Canvas.TextRect(RFG,0,0,t);
      Target.CopyRect(RBG,fg.Canvas ,RFG);
     
    End;
    Procedure TTextSprite.Hide;
    begin
      if FActive then
        Target.CopyRect(RBG,bg.Canvas ,rfg); //REPLACE L'IMAGE TARGET
    end;
     
    end.
     
    {
    exemple d'utilisation
     code Pour bouger le TextSprite
     Dans create form..
     1-ts:=TTextSprite.Create(PaintBox1);
       ts.fg.Canvas.Brush.Color:=rclred;
     
     ...
     
     Dans mouseMove
     ts.Hide;                                                                //Replacer l'image arriere
     ts.Show(x,y,'Coor :'+ Inttostr(x) +','+ inttostr(y));   //Memorise l'image arriere et affiche le TextSprite devant Limage arriere
     
    }
    A+

    EDIT:
    Je n'ai plus d'erreur J'avais oublié une petite instruction dans le code, désormais, tout fonctionne

    Pour l'utilisation :
    Avec un TPaintBox par exemple :
    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
      ts:=TTextSprite.Create(PaintBox1.Canvas);
      ts.FG.Canvas.Brush.Color:=clRed;
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      ts.Hide;
      ts.Show(x,y,'Coor :'+ Inttostr(x) +','+ inttostr(y));
    end;
    Pour une Form :
    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
      ts:=TTextSprite.Create(Form1.Canvas);
      ts.FG.Canvas.Brush.Color:=clRed;
    end;
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      ts.Hide;
      ts.Show(x,y,'Coor :'+ Inttostr(x) +','+ inttostr(y));
    end;
    J'espère que ça te correspondra ...
    A+

  3. #3
    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
    Salut,

    J'ai testé le code en pensant que BG : TBitMap; serait utilisé comme une image qui accompagenrait le texte mais nenni. Bien que le code marche, si c'est juste pour afficher les coordonnées de la souris il est bigrement plus simple d'utiliser un TLabel qui peut même être rendu transparent et dont on fait varier le Left et le Top en fonction du X,Y du MouseMove : ça prend une poignée de lignes de code au lieu des 120 utilisées par TTextSprite = Class.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      with label2 do
      begin left:=X+5; top:=Y+5; caption:='Coor : '+ Inttostr(x) +','+ inttostr(y); end;
    end;
    A+

    EDIT : un oubli, il faut que le Label utilisé à cet effet soit le dernier objet posé sur la Form sinon il risque de passer en-dessous de ceux qui y ont éventuellement été déposés après lui.

  4. #4
    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
    Sinon à la place de Tpaintbox, on pourrait mettre Tgraphiccontrol mais pour un bitmap, c'est pas bon(Tgraphic).

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par Archimède Voir le message
    Sinon à la place de Tpaintbox, on pourrait mettre Tgraphiccontrol mais pour un bitmap, c'est pas bon(Tgraphic).
    Justement, je ne pense pas que ça fonctionne . J'avais essayé et le soucis, c'est qu'on accède pas au Canvas ... Donc je suis passé par un TCanvas directement

  6. #6
    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
    Salut,

    à la place de Tpaintbox, on pourrait mettre Tgraphiccontrol
    ... si j'ai bien pigé, l'objectif est d'afficher les coordonnées de la souris à côté du pointeur de la souris "sans affecter l'image en dessous" donc quel que soit l'objet (TForm, TPaintBox, TImage, Tgraphiccontrol ...) qui contient cette image ... et pour faire ceci il suffit d'un TLabel.

    A+

    EDIT : posts croisés

  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
    Citation Envoyé par ero-sennin Voir le message
    Justement, je ne pense pas que ça fonctionne . J'avais essayé et le soucis, c'est qu'on accède pas au Canvas ... Donc je suis passé par un TCanvas directement
    Ok, c'était une idée comme ça... J'ai pas testé... je te fais confiance.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 14
    Points
    14
    Par défaut

    Dabord je voudrait vous dir que je suis agrablement surpris de votre hospitalite
    et merci a tous car sa ma beaucoup aider au sujet de passer le canvas au lieut de l'objet ( je croyait que je ne pouvait pas passer un canvas au paravant )

    Pour repondre a la question du TLabel
    je prefere utiliser mon TTextSprite au lieu d'utiliser un TLabel car s'est une question de rapiditer et de pouvoir afficher autre chose dans future.
    vous savez la rapidite du graphic sur XP n'est pas terible par rapport a window2000.


    Merci a tous et particulierement a toi ero-sennin


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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/09/2013, 11h47
  2. Objets Font et FontMetrics
    Par perldebutant dans le forum 2D
    Réponses: 5
    Dernier message: 03/01/2008, 19h57
  3. Changer la couleur de "font" dans un objet de type "ImageFont" dans PIL
    Par KINENVEU dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 07/06/2007, 03h29
  4. [Débutant] déplacement indépendant d'un objet
    Par Rafoo dans le forum OpenGL
    Réponses: 5
    Dernier message: 25/06/2006, 12h17
  5. [C#] Comment sérialiser un objet Font ?
    Par djmanu dans le forum C#
    Réponses: 5
    Dernier message: 20/01/2006, 09h51

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