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 :

Canvas et bitmap


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Par défaut Canvas et bitmap
    rebonjour
    J'ai un objet dans le quel je veut afficher un fichier bitmap, j'ais fait appel a son canvas en luis passon un TBitmap contenant mon image mais j'ais eu une erreur disant :"Canvas does not allow drawing" ??

    voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
    Graph:=TBitmap.Create;
     Graph.LoadFromFile(extractfilepath(application.ExeName)+'\DATA\img\dessin.bmp');
     Graph.PixelFormat:=pf24bit;
     can:=TCanvas.Create;
     can.Draw(0, 0, Graph);
     sg.Draw(can);
    end;
    sg représente mon objet qui est de type TSimpleGraph
    merci de l'intervention

  2. #2
    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
    Par défaut
    Je n'ai pas le type TSimpleGraph sous Delphi 5 mais je suppose qe ton objet sg comporte par exemple un TImage destiné à contenir un BitMap :

    et dans ce cas essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Code :
     
    procedure TForm2.FormCreate(Sender: TObject);
    begin
                  Graph:=TBitmap.Create; // je suppose que la var Graph est déclarée ailleurs
                  Graph.PixelFormat:=pf24bit;
                  Graph.Width:=sg.Image1.Width; 
                  Graph.Height:=sg.Image1.Height; 
                  Graph.LoadFromFile(extractfilepath(application.ExeName)+'\DATA\img\dessin.bmp');
                  sg.Image1.Canvas.Draw(0,0,Graph); 
                  // ou bien sg.Image1.Canvas.StretchDraw(RectangleDeDestination,Graph); 
     
    end;
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    A verifier mais peut etre que le canvas doit etre initialise avec un handle .....
    Soit en lui affectant, soit en en creant un non ?

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Verification faite :

    Citation Envoyé par Aide Delphi
    La propriété Handle spécifie le handle GDI Windows du contexte de périphérique de ce canevas.

    Affectez à Handle le HDC du contexte de périphérique dans lequel le canevas doit dessiner. Quand un contrôle fenêtré répond à un message de dessin Windows, le HDC de dessin est retransmis à la méthode PaintWindow. Dans les autres cas, il est possible d'obtenir un HDC pour une fenêtre en appelant la méthode GetDeviceContext d'un contrôle. De plus, Windows dispose de fonctions de l'API pour obtenir le HDC d'une imprimante ou d'une image mémoire.

    Consultez la propriété Handle pour aller au-delà des possibilités de dessin offertes par l'objet TCanvas, en utilisant des appels de fonction de l'API qui nécessitent un handle de contexte de périphérique. La plupart des appels de fonctions GDI Windows attendent un paramètre HDC.

    TCanvas ne possède pas le HDC. Les applications doivent créer un HDC et l'affecter à la propriété Handle. Les applications doivent libérer le HDC quand le canevas n'en a plus besoin. L'affectation de la propriété Handle d'un canevas ayant déjà un HDC valide ne libère pas automatiquement le HDC préexistant.

    Remarque*: Certains descendants de TCanvas, comme TControlCanvas, possèdent le HDC. N'affectez pas la propriété Handle de ces objets. Ils obtiennent et libèrent leur propre handle.
    Donc passe peut etre par TControlCanvas qui semble creer lui meme le handle.
    Sinon tu doit creer et liberer le Handle via les API windows, a moins que Delphi n'en propose, je n'ai jamais fait ca
    Sans Handle, le canvas n'a pas de cible pour ces graphique d'ou ton erreur.

  5. #5
    Membre éclairé Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Par défaut
    En realite le TSimpleGraph est un Composant faisant partie de la collection Delphi Aerea (ce composant et gratuit et est intérréssant)
    Bon j'ais pas le Timage mais aprés quelque modif j'ais une nouvelle erreur m'indiquant une tentative de lecture de l'adresse 00000000000 ???

    l'execution s'arrette a la ligne créant le canvas( indiquer en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    procedure TForm2.FormCreate(Sender: TObject);
    begin
     Graph:=TBitmap.Create;
     Graph.PixelFormat:=pf24bit;
     Graph.Width := sg.Width;
     Graph.Height := sg.Height;
     Graph.LoadFromFile(extractfilepath(application.ExeName)+'\DATA\img\dessin.bmp');
     can.Draw(0, 0, Graph);
     can:=TCanvas.Create;
     sg.Draw(can);
    end;

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    can.Draw(0, 0, Graph);
    can:=TCanvas.Create;
    Tu l'utilise avant de le creer

  7. #7
    Membre éclairé Avatar de kanzarih
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2002
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2002
    Messages : 327
    Par défaut
    ah oui
    mais maintenant je revien a la première erreur : "Canvas does not allow drawing" ??
    et c'est au moment du "draw" du "sg" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm2.FormPaint(Sender: TObject);
    begin
    Graph:=TBitmap.Create;
     Graph.PixelFormat:=pf24bit;
     Graph.Width := sg.Width;
     Graph.Height := sg.Height;
     Graph.LoadFromFile(extractfilepath(application.ExeName)+'\DATA\img\dessin.bmp');
     can:=TCanvas.Create;
     can.Draw(0, 0, Graph);
     sg.Draw(can);
    end;

  8. #8
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Bha oui .... tu as pas lu mon post ?
    Il faut initialiser le Handle et l'affecter a la proprietee handle de ton canvas.

    Je n'ai pas l'habitude de faire ca mais j'ai trouve dans l'unitee windows la fonction CreateDC et il doit y avoir surement son pendant ReleaseDC.

    Apres en ce qui concerne les parametres, le mieux et de chercher sur le net

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Can := TCanvas.create;
    Can.Handle := CreateDC(...);
    [..]
    ReleaseDC(???, Can.Handle);
    Can.Free;

Discussions similaires

  1. [Lazarus] Différence entre Image.Canvas et Image.Picture.BitMap.Canvas
    Par ChPr dans le forum Lazarus
    Réponses: 17
    Dernier message: 15/09/2011, 07h27
  2. Tableau de bytes et canvas d'un bitmap
    Par colorid dans le forum Langage
    Réponses: 18
    Dernier message: 03/12/2010, 13h11
  3. [canvas] Bitmap transformer une couleur en transparent
    Par Arcantos512 dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 12/11/2010, 23h27
  4. Réponses: 31
    Dernier message: 29/11/2008, 14h03

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