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 :

[Transparent] - Comment dessiner sur 2 TImage ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut [Transparent] - Comment dessiner sur 2 TImage ?
    Bonjour a tous !

    Voila ! j'ai un TImage, sur ce TImage y figure un dessin que j'ai déja dessiner moi même, mais je voudrais pouvoir ajouter un autre dessin sur ce TImage, sans que cela pertube le premier dessin que j'ai fait, bien evidement. Mais le probléme est que quand je dessine par dessus mon premier dessin celui-ci prend les couleur de mon second dessin, mais moi j'aimerais que mon premier dessin reste sans modification.

    En clair je voudrais un dessin avec deux couche différente sur mon TImage, et ma question est : est-ce possible ? si oui comment !

    Je tenais a vous dire que je suis débutant, alors allez y molo sur les termes technique, Merci !

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Oui c'est possible, il faut préalablement créer deux objets TBitmap.
    Pour l'affichage dans le Timage, Tu peux utiliser la propriété TImage.Canvas.copyrect, Timage.Canvas.draw ou meme BitBlt.

    Mettre une couleur transparente au bmp2 pour que la superposition soit prise en compte.

    Si tu veux directement dessiner sur le bmp2 a partir du Timage , suffit de passer par les evenements du Timage (OnmouseMove, OnMouseDown) en agissant directement sur le canvas du bmp2 et non sur le canvas du Timage.

    si tu veux un ptit exemple, fais moi signe !

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    He ben tout d'abord merci !

    Et franchement si tu pourrait me donner un exemple cela m'aiderait énormément, et surtout cela m'evitera d'y passer toute la nuit !

    Merci !

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Bon ben voila ce que j'ai fait, mais cela ne fonctionne pas du tout !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        Bitm:=TBitmap.Create;
        Bitm.Canvas.MoveTo(100,50);
        Bitm.Canvas.LineTo(50,50);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
        Bitm.Free;
    end;
    Alors juste une chose, pourquoi !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    C'est normal que cela ne fasse rien de visible

    Tu dessines sur un TBitmap en mémoire, dessine sur un TImage (ou bien tu dessines cette bitmap sur le TImage) comme te l'a dit portu.

  6. #6
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    He ben j'ai essayer ceci, mais je ne vois jamais mon carré rouge. j'ai essayer de jouer avec les différente propriété de "TransparentColor", "TransparentMode", et même avec "Transparent", mais ça fonctionne pas.

    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.FormCreate(Sender: TObject);
    var
        Composant : Tbitmap;
    begin
    Composant:=TBitmap.Create;
    Composant.Width:=Image1.Width;
    Composant.Height:=Image1.Height;
    Image1.Canvas.Brush.Color:=RGB(255,0,0);
    Image1.Canvas.Rectangle(50,50,100,100);
    Composant.TransparentColor:=clwhite;
    Composant.Canvas.Brush.Color:=RGB(0,0,255);
    Composant.Canvas.Rectangle(70,70,120,120);
    Image1.Picture.Bitmap:=Composant;
    end;
    Alors j'ai juste une chose a dire, Aidez-moi s'il vous plait !
    Merci !

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Salut c'est encore moi !

    J'ai reussi a faire ceci :

    Création de mon BitMap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Composant:=TBitmap.Create;
        Composant.Width:=Image1.Width;
        Composant.Height:=Image1.Height;
    end;
    Ensuite création d'un premier carré et affectation de mon BitMap a la propriété Picture de mon TImage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        Composant.Canvas.Brush.Color:=ColorBox2.Selected;
        Composant.Canvas.Rectangle(70,70,120,120);
        Image1.Picture.Bitmap:=Composant;
    end;
    Et ensuite on dessine un autre carré sur le TImage cette fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button2Click(Sender: TObject);
    begin
        Image1.Canvas.Brush.Color:=ColorBox1.Selected;
        Image1.Canvas.Rectangle(10,10,40,40);
    end;
    Et le probléme est que quand je dessine un carré avec mon Bitmap nommé "Composant" est bien il efface mon carré sur le TImage, et moi je veut pas.

    Donc, merci a ceux qui voudront bien m'aider !

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    C'est encore moi, donc pour résumé ce que je veut faire :

    En clair je veut faire une grille, qui simulerait un schéma electrique, sur ce shéma electrique je pourrait y mettre plein de composant electronique, donc plein de petite image, mais il y a la grille derriére que l'on peut personnaliser avec les couleur, et moi je veut pas que quand on change la couleur tous s'efface, en clair je veut une grille indépendante des mes diférent composant, mais ci a chaque fois que je change la grille de couleur tout s'efface, ça peut pas aller !

    Pour l'instant mon seul moyen d'arriver a mes fin, serait de ne pas personaliser l'affichage de ma grille, mais cela me plait pas du tout !

    Voila vous avez une idée assez clair de ce que je veut faire ! Donc si quelq'un pourrait m'aider, cela serait super sympa, Merci !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    pourquoi tu ne superposes pas 2 Timage l'un avec ton fond et l'autre avec tous les cablages (avec une couleur de transparence)

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut reponse pour une copy d'image
    Bonjour,
    vous pouvez essayer la fonction TransparentBlt (unité Windows)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     TransparentBlt(
             Destinataire.Canvas.Handle,  
               0, 0, Destinataire.Width, Destinataire.Height,
             Source.Canvas.Handle,  
               0, 0,  Source.Width, Source.Height,
             TransparentColor
            );

    par exemple
    Destinataire et source
    Je dessine un rond dans le bitmap Destinataire.
    Je rempli TOTALEMENT l bitmap Destinataire avec la couleur transparentColor, puis je dessine un autre motif avec d'autre couleurs.

    transparentBlt Copy le motif dans destinataire, en ignorant tous les pixels de la couleur trnasparentColor (le fond en autre).

  11. #11
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut Re: reponse pour une copy d'image
    Tout d'abord merci a Thunder et Tardiff, et désolé de ne pas avoir répondu plus tot, mais j'ai préférer passez a autre chose, au lieu d'y passer toute la semaine.

    Sinon pour te répondre Thunder j'ai déja essayer de faire ce que tu ma dit, du moins je crois, car je suis un peu débutant, enfin bref voici un exemple de ce que j'avais 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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Composant1:=TBitmap.Create;
        Composant1.Width:=Image1.Width;
        Composant1.Height:=Image1.Height;
        Composant1.TransparentColor:=clWhite;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        Composant1.Canvas.Brush.Color:=ColorBox1.Selected;
        Composant1.Canvas.Rectangle(70,70,120,120);
        Image1.Picture.Bitmap:=Composant1;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
        Image1.Canvas.Brush.Color:=ColorBox2.Selected;
        Image1.Canvas.Rectangle(10,10,40,40);
    end;
    Je sais pas si c'est vraiment ça que tu voulais m'expliquer, mais en gros quand je redessine mon BitMap nommé "Composant1" est bien il repasse en premier plan en écrasant "Image1.Canvas".
    Avec la couleur transparente c'est la même !

    Et maintenant pour te répondre Tardiff, et bien je dirait que j'ai essayer ton exemple, sans trop y comprendre quelque chose je te l'avous
    si tu pourrait m'apporter un peu plus de precision je t'en serait trés reconnaissant. Merci !

  12. #12
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 133
    Points : 113
    Points
    113
    Par défaut
    Sur le canevas de Image1 tu trace l'arriere plan, que tu pourra changer de couleur quand tu veux.

    Et pour tes composants électroniques, a chaque fois que tu en place un, tu crée dynamiquement (va voir dans a FAQ c'est bien expliqué avec exemples) un composant TImage qui contiendra ton composant electronique.
    Tous ces composants TImage devront avoir la propriété transparent à true, pour pouvoir voir Image1 en arriere plan

    (cette solution n'est bonne que pour un résultat visuel dans ton appli. Si c'est pour ensuite enregistrere le montage electrique sur le disque dur ... ce n'est pas pratique !)

    Edit : Peux tu préciser le but de ton appli ? Ca pourrait aider à trouver une bonne solution

  13. #13
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    En faite le but de mon application serait de créer un simulateur electronique, et non de la saisie de schéma, donc si je peut économiser le plus de ressource possible en evitant de balancer des BitMap a droite a gauche cela serait super !

    Surtout que celle-ci est une application MDI, en clair elle pourra ouvrir plusieur schéma, contenant au maximum 50 folios chacun, et a ce niveau la, si je doit créer un BitMap par composant, sachant qu'un seul folio pourra contenir environ une bonne cinquantaine de composant, je craint que les ressource s'éffondre...

    Donc pour résumé :

    -1- J'ai créer un composant Grille, celui-ci dérive de TGraphicControl. ce composant grille constitue l'arriére plans, avec un pas de grille modifiable. La grille et l'arriére plans peuvent avoir des couleur différente.

    -2- J'ai créer un autre composant, celui ci représente un composant electronique, je les dérivé aussi de TGraphicControl, et il y en aura d'autre bien entendus, en clair tout les composant electronique de base.

    -3- Ensuite je dessine tout bêtement les connexion sur la grille a l'éxécution,
    mais ces connexion peuvent aussi avoir des couleur différente, elle doivent donc être sur un autre Canevas que celui de la grille, tout en étant sur le même.

    Voila, je pense que vous avez un apercu assez clair de ce que je veut faire, sachant que je débute en Delphi depuis 2 mois, je me doute que cela n'est peut être pas la bonne solution, mais il faut bien commencer par quelque chose !

    Sur ce Merci pour votre aide !

  14. #14
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    La solution pour ce genre de problèmes est relativement simple. Il faut tout tracer "à la main" : on part d'un TPaintBox par exemple, et dans l'événement OnPaint on réalise tous les tracés nécessaires (grille, composants, liaisons).

  15. #15
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Merci pierre, il est vrai que je n'avais pas pensez au TPaintBox, et je vais voir ça de suite !

  16. #16
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Salut a tous ! c'est encore moi, et a vrai dire, je ne pense pas que j'essairais la solution a pierre étant donnée que Portu me l'a envoyé, en faite ce n'est pas la solution de pierre, mais c'est une autre façon, et importe la façon, du moment que cela fonctionne, et que ce n'est pas une usine a gaz !

    Alors pour ceux qui aurait eu un probleme du même genre, je vous donne la solution :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Image1: TImage;
        RadioGroup1: TRadioGroup;
        RadioGroup2: TRadioGroup;
        procedure FormCreate(Sender: TObject);
        Procedure AfficheSurImage(Mode : Integer);
        procedure RadioGroup2Click(Sender: TObject);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      Bmp1,Bmp2 : Tbitmap;
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    //Création des TBitmap
    Bmp1 := TBitmap.Create;
    Bmp2 := TBitmap.Create;
    //chargement des bitmap dans le dossier du l'application
    Bmp1.LoadFromFile('Bmp1.bmp');
    Bmp2.LoadFromFile('bmp2.bmp');
    // Couleur transparente
    Bmp1.TransparentColor := clWhite;
    Bmp2.TransparentColor := clWhite;
    //Activer la transparence
    Bmp1.Transparent := true;
    Bmp2.Transparent := true;
    //Taille du crayon
    Bmp1.Canvas.Pen.Width := 3;
    Bmp2.Canvas.Pen.Width := 3;
    AfficheSurImage(0);
    end;
     
    // Affiche un dessin dans l'image suivant le mode
    Procedure TForm1.AfficheSurImage(Mode : Integer);
    begin
    Case Mode of
    // copie suelement le bitmap 1
    0 : Begin
          //Efface le contenu de Image1
          Image1.Canvas.FillRect(Image1.ClientRect);
          // copie
          Image1.canvas.Draw(0,0,bmp1);
        end;
    // copie suelement le bitmap 2
    1 : Begin
          //Efface le contenu de Image1
          Image1.Canvas.FillRect(Image1.ClientRect);
          // copie
          Image1.canvas.Draw(0,0,bmp2);
        end;
    //Copie bmp 1 et bmp 2
    2 : Begin
          //Efface le contenu de Image1
          Image1.Canvas.FillRect(Image1.ClientRect);
          // copie
          Image1.canvas.Draw(0,0,bmp1);
          Image1.canvas.Draw(0,0,bmp2);
        end;
    //Copie bmp 2 et bmp 1
    3 : Begin
          //Efface le contenu de Image1
          Image1.Canvas.FillRect(Image1.ClientRect);
          // copie
          Image1.canvas.Draw(0,0,bmp2);
          Image1.canvas.Draw(0,0,bmp1);
        end;
    end; //case of
    end;
     
     
    procedure TForm1.RadioGroup2Click(Sender: TObject);
    begin
    AfficheSurImage(RadioGroup2.ItemIndex);
    end;
     
     
    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
    AfficheSurImage(RadioGroup2.ItemIndex);
    end;
     
     
    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
    // Si le click gauche est enfoncé et que le curseur bouge, ca dessine
    If SsLeft in Shift then begin
       If RadioGroup1.ItemIndex = 0 then begin
       Bmp1.Canvas.Moveto(x,y);
       Bmp1.Canvas.Lineto(x+1,y+1);
       end else begin
       Bmp2.Canvas.Moveto(x,y);
       Bmp2.Canvas.Lineto(x+1,y+1);
       end;
    //Refresh de l'affichage
    end;
    end;
     
    end.
    Et on peu pas dire que cela est compliquer, alors bon developpement !

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

Discussions similaires

  1. Comment dessiner sur une TextBox
    Par Alexandre` dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/04/2009, 13h48
  2. comment dessiner sur une image
    Par baracouda dans le forum Graphisme
    Réponses: 2
    Dernier message: 26/05/2006, 01h21
  3. Comment dessiner sur un Bitmap sans scintillement ?
    Par TOTO32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 10/01/2005, 11h11

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