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

C++Builder Discussion :

TRichEdit & bitmap [Sources]


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut TRichEdit & bitmap
    Bonsoir à tous.
    Je ne sais quel composant bcb utiliser pour afficher du texte et des images bmp. Je cherche en fait à pouvoir insérer des smileys dans le cadre d'un "chat". En fait, pour ceux qui visualisent les fenêtres de dialogues d' msn messenger, c'est exactement ce qui me conviendrait
    Pour l'instant j'utilise un TRichEdit qui n'est ma fois pas trop mal.

    J'ai vu que ce composant supporte le RTF, donc je me suis dit youhou dans ce cas pas de pb, vu que ce format permet l'insertion de bmp. Afin de tester, j'ai donc créé un fichier RTF dans lequel j'ai mis du texte formaté ainsi qu'un petite image bitmap:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TMemoryStream* fd = new TMemoryStream(); 
    fd->LoadFromFile("fichier.rtf");
    RichEdit1->Lines->LoadFromStream(fd);
    Le pb est qu'à l'affichage, dans mon RichEdit, seul le texte apparaît et pas l'image, ce qui est fort regrettable lol.
    Par conséquent si quelqu'un connait une astuce, ou mieux un composant plus approprié à cet usage, je suis preneur.

    Par avance merci.

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Bonsoir Ricky81.
    Je connaissais en effet ce post, mais je me demandais s'il n'y avait pas un moyen plus simple sans devoir utiliser une classe développée spécialement pour résoudre ce pb.
    Je vais regarder comment ça fonctionne, et j'en déduis donc qu'un RichEdit n'est vraiment pas souple pour mélanger txt & image.

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonsoir,

    il me semble avoir lu que le RichEdit ne pouvait pas prendre ceci en charge.
    Je pense que tu n'as que ca comme solution pour l'instant.
    Tiens nous au courant si tu suis cette piste, on n'a jamais eu de retour sur ce composant...

    Bon courage

    Eric

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Re bonsoir.
    Bon après avoir essayé d'utiliser la classe donnée dans le lien sans succès (ca compile mais pas le résultat escompté :p) je pense que je vais abandonner cette idée.
    D'ailleurs je trouve la classe pauvre en méthodes (genre 5 ou 6) Je suis complètement néophyte en matière de composants OLE mais il me semble que ce n'est pas trop une classe adaptée pour insérer facilement des images ds un richedit. De plus cette classe dâte de 1998, l'auteur dit qu'elle marche sous BCB... 3.0 ^^
    Enfin voilà quoi, si je m'y connaissais suffisamment je me serais attardé plus longuement sur le problème, mais là :p
    C'est quand même bizarre qui bcb ne dispose pas d'un tel style de composant, je trouve que ça pourrait être bien utile, vu qu'apparemment je ne suis pas le seul à m'être heurté à ce genre de difficultés.

    Pour finir, je ne sais pas trop quel tag mettre à ce post lol. [Echec critique] ? [Non Suivi] ? :-)

    Merci quand même en tout cas.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Bonsoir !
    Etant d'un naturel têtu je reviens sur ce problème un mois après, car après de nombreuses recherches j'ai un peu avancé.. Pour l'instant rien ne marche lol, mais je suis persuadé que je ne suis pas loin de la solution. Voilà un lien extrêmement intéressant que j'ai trouvé:

    http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/

    Sur cette page très bien faite, l'auteur explique comment il s'y est pris pour parvenir à ce "prodige" :-) , et je dois avouer que l'exécutable téléchargeable est impressionnant (pour moi en tout cas, car c'est exactement ce que je souhaite parvenir à faire). Preuve à l'appui, il est donc tout à fait possible d'insérer une image de type bitmap dans un RichEdit.
    Si je me permets de poster ce message, c'est pour solliciter de l'aide auprès de ceux qui se sentent le courage de mettre en application ce tutorial.
    Certes le code fourni utilise essentiellement des API windows et la MFC, d'ailleurs moi qui ne suis pas doué j'vous raconte pas la galère pour intégrer et compiler les seuls fichiers qui importent, à savoir:

    ImageDataObject.h
    ImageDataObject.cpp
    StdAfx.h
    StdAfx.cpp

    Donc pour le moment voilà où j'en suis: ça compile (c'est déjà ça mdr)
    La fonction principale à appeler est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CImageDataObject::InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap)
    Voilà ce que moi je 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
     
    IRichEditOle * pRichEditOle;
     
    SendMessage((HWND) WindowDial->Handle,
                         (UINT)EM_GETOLEINTERFACE,
                          0,
                         (LPARAM)&pRichEditOle);
     
    CImageDataObject * pDataObj = new CImageDataObject;
    Graphics::TBitmap  * pBmp  = new Graphics::TBitmap;
     
    pBmp->LoadFromFile("image.bmp");
     
    pDataObj->InsertBitmap(pRichEditOle, pBmp->Handle);
    Je sais que mon pointeur pRichEditOle est valide. J'imagine que mon Handle Bitmap l'est également.
    Pourtant, lorsque la fonction GetOleObject() est appelée, j'ai une exception MFC qui se déclenche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    External exception EEFFACE.
    Pour le moment je ne sais pas à quoi elle correspond. Si quelqu'un avait un peu de temps pour tester et me dire où je me suis planté, ou du moins s'il rencontre le même type de difficulté, ce serait bien sympatique de sa part. Je continue pour ma part à chercher (enfin heu mnt bedtime quand même :p)

    D'avance merci.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    A mon avis ce que tu fais reviens en même que d'utiliser le lien qu'on t'a donné plus haut. Ce n'est pas un RichEdit standard mais un RichEditOle que tu utilises, ce qui devait être implémenté dans la classe TRichEditOle dont le lien se trouve un peu plus haut et qui t'aurais donc éviter de faire du MFC...
    Maintenant ce n'est qu'un avis de spectateur, je ne me suis jamais intéressé au problème.
    Neilos

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Salut Neilos.
    Certes dans les deux cas on manipule des RichEditOle, seulement dans le premier lien je t'assure que le code est 10 foix plus dense et plus complexe, je n'y ai strictement rien capté pour être honnete. J'avais réussi à le faire fonctionner en fait finalement, mais il se trouve qu'à l'utilisation ça appelle une boite de dialogue (ressemblante à celle qu'on retrouve dans les éditeurs de texte format RTF pour insérer des cliparts) d'où on choisit le fichier image à insérer.
    Moi je ne veux en aucun cas sélectionner une image via une boite de dialogue qu'on m'impose (tu testeras si tu veux pour voir l'horreur que ça rend :p)
    A+

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Ok, t'inquiète jte crois sur parole..juste la ressemblance du nom m'avait frappé et j'avais entendu dire que les MFC c'est bof...maintenant je ne connais strictement rien en MFC.

    L'essentiel étant que ton problème soit résolu.
    Neilos

  10. #10
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    ou mieux un composant plus approprié à cet usage, je suis preneur.
    Le RXRichedit de la RXLib
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup CGI. Je ne connaissais pas l'existence de ce composant. Je viens d'installer la rxLib, et j'avoue que je suis bluffé par le RxRichEdit.
    Reste maintenant à implémenter la méthode d'insertion. J'ai vu sur un forum delphi le code d'une fonction qui génère du RTF à partir d'un bitmap. Je vais tenter d'adapter la fonction en C++, et puis on verra bien ce qui arrivera ma fois.
    Je vous tiens au courant, et merci encore.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    CGI & la RXLib :-)

    Re donc. Je n'ai pas eu à réécrire la fonction BitmapToRTF() finalement, en cherchant sur google j'ai trouvé mon bonheur.
    Il a fallu que je fasse qd même qq petites modifs car sinon j'obtenais sur le RxRichEdit des images d'une piètre qualité, comme si elles étaient en 16 couleurs.. Y avait un souci dans l'extraction des nombres hexa, bref.
    Je vous poste le code de la fonction que j'utilise.

    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
     
    AnsiString BitmapToRTF(Graphics::TBitmap *pict)
    {
         Cardinal bis, bbs, I;
         AnsiString bi, bb, hexpict, achar;
         AnsiString rtf = "{\\rtf1 {\\pict\\dibitmap ";
     
         //On récupère la taille du header & la taille de l'image
         GetDIBSizes(pict->Handle, bis, bbs);
     
         bi.SetLength(bis);
         bb.SetLength(bbs);
     
         //On stocke les infos header et data respectivement dans des char tab bi & bb
         GetDIB(pict->Handle, pict->Palette, &((bi.c_str())[0]), &((bb.c_str())[0]));
     
         hexpict.SetLength((bi.Length() + bb.Length()) * 2);
         I = 1;
     
         for (bis = 0; bis < bi.Length(); bis++) //Partie header du bmp
         {
              achar = IntToHex((int)((bi.c_str())[bis]), 2);
              const int SizeHexa = achar.Length();
     
              if (SizeHexa == 1)
                  achar = "0" + achar;
     
              else //On a affaire à des puissances de 2
              {
                   (hexpict.c_str())[I-1] = (achar.c_str())[SizeHexa -2];
                   (hexpict.c_str())[I]   = (achar.c_str())[SizeHexa -1];
              }
     
             I += 2;
         }
     
         for (bbs = 0; bbs < bb.Length(); bbs++) //Partie "data" du bmp
         {
              achar = IntToHex((int)((bb.c_str())[bbs]), 2);
              const int SizeHexa = achar.Length();
     
              if (SizeHexa == 1)
                  achar = "0" + achar;
     
              else //On a affaire à des puissances de 2
              {
                   (hexpict.c_str())[I-1] = (achar.c_str())[SizeHexa -2];
                   (hexpict.c_str())[I]   = (achar.c_str())[SizeHexa -1];
              }
     
              I += 2;
         }
     
         return (rtf + hexpict + " }}");
     
    } //BitmapToRTF()
    Ensuite, pour insérer l'image, je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Graphics::TBitmap * bmp = new Graphics::TBitmap;
    bmp->LoadFromFile("image.bmp");
     
    TStringStream *SS = new TStringStream(BitmapToRTF (bmp));
    RxRichEdit->Lines->LoadFromStream(SS);
    delete SS;
    Et là le miracle opère. Ca marche nickel. J'ai pris la peine de mettre un peu de code car je pense que ça pourra servir à d'autres.
    Ptite remarque en passant: ça marche, par contre l'image affichée dans le rxRichEdit est redimentionnable...
    C'est pas trop le top - franchement pas même - mais j'ai vu sur le forum Delphi une astuce que j'essairai d'appliquer (c'est pas gagné mdr)
    Ceci est une autre histoire :-)

    ++
    Run.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2002, 18h26
  2. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40
  3. Pb Lecture de bitmap monochrome
    Par Loïc38 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/07/2002, 18h24
  4. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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