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 :

[Win32][D7] TMemo : afficher une image en arrière plan [Fait]


Sujet :

Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut [Win32][D7] TMemo : afficher une image en arrière plan
    Salut,

    Dans le cadre d'un développement, je souhaiterais afficher un logo (bitmap) en image de fond d'un Memo.

    Malheureusement, ce composant ne dispose pas de canvas et la solution du TControlCanvas semble ne pas fonctionner.

    Je pense qu'il doit y avoir une solution très simple... mais je ne vois pas

    Quelqu'un aurait-il une idée ?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 919
    Points : 6 035
    Points
    6 035
    Par défaut
    Ne peux-tu pas exploiter le bitmap du brush duTMemo ?

  3. #3
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    J'avais tenté cela mais l'image est répétée (mosaique)

    Il existe peut etre une astuce pour éviter cela... mais je n'ai pas trouvé

    Merci

    EDIT : Je peux toujours gérer cela avec le bitmap en amont mais ca commence a raloudir pas mal le code...
    Je vais faire des tests pour voir...

    EDIT2 :
    voici le code (ca fait pas très propre...)
    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
    var
      bmp,bmp2 : TBitmap;
    begin
      bmp := TBitmap.Create;
      bmp2 := TBitmap.Create;
     
      bmp.LoadFromFile('MonLogo.bmp');
     
      bmp2.Height := MonMemo.ClientHeight;
      bmp2.Width := MonMemo.ClientWidth;
     
      bmp2.Canvas.Draw(bmp2.Width-250,bmp2.Height-150,bmp);
     
      MonMemo.Brush.Bitmap := bmp2;
     
      bmp.Free;

  4. #4
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    En fait c'était pas ca le problème

    Je viends de refaire des tests...
    L'écriture du memo passe au dessus de l'image... et donc l'efface

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonMemo.Brush.Style := bsClear;
    rend complètement transparent le memo et ses parents (je vois mon bureau au travers)

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 919
    Points : 6 035
    Points
    6 035
    Par défaut
    Sinon, reste à te tourner vers des composants "tiers", mais tu ne peux peut-être pas au titre de ton projet

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    J'ai testé ton code sans succès. Peux tu remettre un exemple stp.

    Merci

  7. #7
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    il suffit de dériver le Tmemo et d'ajouter :
    1- une propriété Timage pour gérer l'image à afficher
    2- faire un override de sa méthode paint pour, en début de séquence, afficher l'image.

    version luxe : ajouter une 2de propriété pour indiquer si l'image est affichée centrée dans le cadre, stretchée ou mosaiquée...

  8. #8
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    En effet, je ne peux pas me tourner vers d'autres composants...

    Citation Envoyé par ALWEBER
    J'ai testé ton code sans succès. Peux tu remettre un exemple stp.

    Merci
    Tu peux mettre ce code dans ta procedure de redimmensionnement par exemple...
    Le code fonctionne tel quel...


    Citation Envoyé par Merlin
    il suffit de dériver le Tmemo et d'ajouter :
    1- une propriété Timage pour gérer l'image à afficher
    2- faire un override de sa méthode paint pour, en début de séquence, afficher l'image.

    version luxe : ajouter une 2de propriété pour indiquer si l'image est affichée centrée dans le cadre, stretchée ou mosaiquée...
    Merci
    Je vais faire la version normale.
    Dommage de devoir dériver le composant pour un seul memo...

    Je vous tiens informé

  9. #9
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Etant donné qu'il n'y a pas de procedure Paint pour le composant TMemo, j'ai tenté de gérer cela autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TMemoFiligran.WMPaint(var Message: TWMPaint);
    begin
      // Fimg : TImage renseigné par une propriété
      if Assigned(Fimg) then
      with Brush.Bitmap do
      begin
        Height := ClientHeight;
        Width := ClientWidth;
     
        Canvas.Draw(Width - Fimg.ClientWidth, Height - Fimg.ClientHeight,Fimg.Picture.Bitmap);
      end;
    end;
    Résultat pas très concluant...
    Curieusement l'image ne se repositionne pas lors d'un redimmensionnement,
    De plus, la largeur de la zone de texte se limite à la largeur initiale du TMemo et l'affichage du texte dans la zone de l'image provoque l'effacement de l'un ou de l'autre...

    Quelqu'un aurait-il une idée ?

    Merci

  10. #10
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Pourrais tu présenter la déclaration de type pour TMemoFiligran pour que je puisse tester

  11. #11
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    En rajoutant inherited en fin de procedure WMPaint le texte s'affiche correctement mais l'image est effacée. Il semblerait que le texte soit afficher sans transparence...

    Je crois que le bitmap n'est initialisé que dans la méthode WMPaint du TWinControl. Ce qui pourrait expliquer les problèmes de positionnement de l'image.

    J'ai beau cherché la méthode d'affichage du TMemo, je ne la trouve pas...

    Quelqu'un aurait-il une idée ?

  12. #12
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par ALWEBER
    Pourrais tu présenter la déclaration de type pour TMemoFiligran pour que je puisse tester
    Voila
    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
    type
      TMemoFiligran = class(TMemo)
      private
        { Déclarations privées }
        Fimg : TImage;
        Fbmp : TBitmap;
        procedure setFimg(const Value: TImage);
        procedure WMPaint(var Message: TWMPaint);message WM_PAINT;
        //procedure WMEraseBkgnd( var Message : TMessage ); MESSAGE WM_ERASEBKGND;
        //procedure WMSize(var Message: TWMSize);message WM_SIZE;
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        { Déclarations publiées }
        property Image:TImage read Fimg write setFimg;
      end;

    EDIT :
    Il semblerait que cela soit impossible (d'après borland)
    Je deleste

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Qui a dit que c'était impossible ???

    J'ai réussi
    Le memo n'a pas été dérivé, c'est un TMemo normal, j'ai juste effectué un hook sur le message WM_CTLCOLOREDIT responsable du dessin de tout les contrôle d'édition standards.

    Voir pièce jointe

    Comme Borland s'est trompé, j'enlève le délestage et ça peut être pas mal pour la FAQ

  14. #14
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Excellent

    Ca marche à merveille...

    WM_CTLCOLOREDIT responsable du dessin de tout les contrôle d'édition standards.
    Je dormirais moins bête ce soir

    Heu... c'est peut etre parce que c'est la fin de journée... mais je ne vois pas le hook...

    +1 pour la FAQ


  15. #15
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 674
    Points : 7 062
    Points
    7 062
    Par défaut
    Citation Envoyé par yobenzen
    Excellent
    +1

    Citation Envoyé par yobenzen
    Heu... c'est peut etre parce que c'est la fin de journée... mais je ne vois pas le hook...
    re +1
    Tu peux expliquer ?

  16. #16
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Apparemment, seul l'exécutable fonctionne. Lorsque je recompile le projet, l'image est effacée par le texte...

    Je vais essayer de rajouter la gestion du message WM_CTLCOLOREDIT

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Hou la la, c'est une "standing ovation" !

    Merci

    Bon, pour les explications, je suis désolé de ne pas vous avoir répondu plus tôt, mon PC à la maison est en panne (Alim qui fait des sienne). En tout cas les voici :

    A chaque fois qu'un contrôle, descendant de TCustomEdit (TMemo, TEdit) doit être redessiné, windows envoie un message WM_CTLCOLOREDIT à sa fenêtre parente. On peut considérer ce message comme une sorte d'évènement OnBeforePaint où windows transmet une structure de message comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WM_CTLCOLOREDIT  
    hdcEdit = (HDC) wParam;   // handle of display context 
    hwndEdit = (HWND) lParam; // handle of static control
    ... que l'on peut directement récupérer en Delphi sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TWMCtlColor = packed record
        Msg: Cardinal;
        ChildDC: HDC;
        ChildWnd: HWND;
        Result: Longint;
      end;
     
    TWMCtlColorEdit = TWMCtlColor;
    ... A travers une procédure appelée par le système de messages, que j'ai déclaré dans mon TForm1 (puisque mon mémo se trouve dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TForm1 = class(TForm)
       Memo1: TMemo;
        ...
        procedure WMCTLCOLOREDIT(var Msg:TWMCtlColorEdit);message WM_CTLCOLOREDIT;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        ABitmap:TBitmap;
      end;
    Après il n'y a plus qu'à écrire ce dont on abesoin de changer dans la partie implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.WMCTLCOLOREDIT(var Msg: TWMCtlColorEdit);
    begin
      inherited;
      SetBkMode(Msg.ChildDC,TRANSPARENT);
      Msg.Result:=Memo1.Brush.Handle;
    end;
    C'est ça qui constitue le Hook...

    //J'ouvre une parenthese
    Je sais ce n'est pas très juste d'appeler ça un Hook, mais pourquoi pas, après tout on intercepte bien un message Windows qu'on interceptait pas avant !
    //Fin de la parenthèse

    Si on regarde l'aide de la SDK Windows à propos de WM_CTLCOLOREDIT, il est dit :
    Return Values

    If an application processes this message, it must return the handle of a brush. Windows uses the brush to paint the background of the edit control.
    Enn d'autres termes :
    Si on affecte une valeur à la valeur de retour du message (Msg.return), elle doit correspondre à la brosse utilisée pour peindre le fond du contrôle.
    En fait, ce qu'on affecte à cette valeur, c'est le handle d'une Brosse (Msg.Result:=Memo1.Brush.Handle;), dans laquelle on a stockee notre image à un moment donné ou à un autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ABitmap.LoadFromFile(OpenPictureDialog1.FileName);
    Memo1.Brush.Bitmap:=ABitmap;
    Ce qu'il faut savoir, c'est qu'à travers le message qu'on récupère dans notre procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.WMCTLCOLOREDIT(var Msg: TWMCtlColorEdit);
    begin
      inherited;
      SetBkMode(Msg.ChildDC,TRANSPARENT);
      Msg.Result:=Memo1.Brush.Handle;
    end;
    ...il y a moyen d'identifier pour quel contrôle est destiné le message, en effet , reprenons les quelques paramêtre que nous fourni windows :
    Msg.ChildDC: HDC; ==> handle de dessin (device context) du contrôle qui reçoit le message, c'est ce paramètre que l'on va transmetre aux API windows ad'hoc pour modifier la couleur de texte et de fond de notre contrôle d'édition.
    Msg.ChildWnd: HWND; ==> c'est le Handle de la fenêtre de notre contrôle d'édition, que l'on peut utiliser pour déterminer à quel copntrôle s'adresse notre message.

    A partir de là, dans notre procédure, on peut très bien indiquer de modifier le fond pour tout les contrôle d'édition de la fiche (c'est ce que j'ait fait, je n'en ai qu'un !), ou bien "filtrer" le message si on a plusieurs contrôles d'édition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.WMCTLCOLOREDIT(var Msg: TWMCtlColorEdit);
     begin
       inherited;
      //on teste si le message est destiné à notre memo
      if Msg.ChildWnd=memo1.handle then
      begin
         SetBkMode(Msg.ChildDC,TRANSPARENT);
         Msg.Result:=Memo1.Brush.Handle;
      end;
     end;
    Ensuite, on peut choisir la couleur de police, ou la couleur de fond que l'on souhaite pour notre texte (pas le contôle d'édition, mais la façon dont sera dessiné le texte) avec les fonctions windows SetTextColor,SetBkColor (ça c'est ce qui ce fait couremment) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.WMCTLCOLOREDIT(var Msg: TWMCtlColorEdit);
      begin
        inherited;
       //on teste si le message est destiné à notre memo
       if Msg.ChildWnd=memo1.handle then
       begin
          SetTextColor(Msg.ChildDC,ColorToRGB(clYellow));
        SetBkColor(Msg.ChildDC,ColorToRGB(clRed));
          Msg.Result:=Memo1.Brush.Handle;
       end;
      end;
    d'autres fonctions de l'API windows assez similaire sont (j'ai pas testé) à priori tout aussi envisageables à ce moment là :
    • SetTextAlign
    • SetTextCharacterExtra
    • SetTextJustification
    • SetMapperFlags
    Et en particulier une, qui demandera à windows de dessiner le texte de notre contrôle en transparence (ou bien opaque avec ce qu'on a transmis par SetBkColor) : SetBkMode.

    En écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetBkMode(Msg.ChildDC,TRANSPARENT);
    on demande à windows de dessiner notre texte, en préservant ce qui aura été préalablement dessiné par la brosse que l'on a transmis


    J'espère que je n'ai pas été trop brouillon dans mes explications, mais c'est vrai que ce n'est pas facile à expliquer

    Sinon, pour votre information, on doit pouvoir faire la même chose avec les contrôles qui reçoivent les messages suivants :
    WM_CTLCOLORBTN, : TButton j'imagine
    WM_CTLCOLORDLG, : Pour une boite de dialogue
    WM_CTLCOLORLISTBOX, : TListbox
    WM_CTLCOLORMSGBOX, :pour une messageBox
    WM_CTLCOLORSCROLLBAR, : pour les scrollbars
    WM_CTLCOLORSTATIC : pour un TStaticLabel par exemple.

    On imagine bien à partir de là le nombre de personalisation fantaisistes que l'on dispose.

    A vos clavier ! Il doit bien y avoir 150 FAQ a rédiger à partir de cette constatation !

  18. #18
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par yobenzen
    Apparemment, seul l'exécutable fonctionne. Lorsque je recompile le projet, l'image est effacée par le texte...
    Je n'ai pas compris, quand toi tu compiles, ça ne marche pas ?
    tu parles de mon code source ou du tien ?...
    Citation Envoyé par yobenzen
    Je vais essayer de rajouter la gestion du message WM_CTLCOLOREDIT
    si tu parles du tien, là je comprend...

  19. #19
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Super l'explication
    Merci

    Non, non je parle bien de ton code source :
    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
    ...
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        OpenPictureDialog1: TOpenPictureDialog;
        Button1: TButton;
        procedure Memo1Change(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        ABitmap:TBitmap;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Memo1Change(Sender: TObject);
    begin
      Memo1.Invalidate;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ABitmap:=TBitmap.Create;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      ABitmap.Free;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if OpenPictureDialog1.Execute then
      ABitmap.LoadFromFile(OpenPictureDialog1.FileName);
      Memo1.Brush.Bitmap:=ABitmap;
      Memo1.Invalidate;
    end;
    C'est pourquoi, on avait quelques difficultés à comprendre

    Sinon, je tente de rajouter (dans mon code) le message WM_CTLCOLOREDIT + procédure associée... mais cela n'est jamais déclenché
    Je dois avoir fais une erreur quelque part... (car la déclaration est identique à ton explication).

  20. #20
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut


    Il y a blême dans le fichier que j'ai envoyé :
    Il manque la moitié du code ! Sorry for that dudes !

    Je reposte le bon dans 5 minutes

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. comment afficher une image comme arriér-plan?
    Par youssef_66_80 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 18/05/2008, 01h00
  2. Mettre une image en "arrière plan"
    Par Pietro_L dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/05/2007, 14h05
  3. [debutant]placer une image en arrière plan d'une JFrame
    Par ashash dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 24/09/2006, 14h18
  4. Dessiner une image en arrière plan d'1 MDI Main Frame
    Par Yacine95000 dans le forum MFC
    Réponses: 3
    Dernier message: 14/06/2004, 10h22

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