begin process at 2012 05 27 18:40:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > METTRE UN HBITMAP DANS UN RICHEDIT

METTRE UN HBITMAP DANS UN RICHEDIT


 Information sur la source

Note :
8 / 10 - par 7 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Niveau :Débutant Date de création :23/12/2004 Date de mise à jour :13/02/2005 10:06:22 Vu / téléchargé :3 893 / 263

Auteur : yoyo269

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Comme le titre l'indique, cette fonction permet d'ajouter un HBITMAP dans un RichEdit.
Pour cela il suffit delui envoyer le handle du RichEdit et celui du Bitmap comme ceci :

if (!InsererBitmap(RichEdithWnd, hBitmap)) MessageBox(NULL, "Le bitmap n'a pas pu être inclus dans le RichEdit !", "Erreur", MB_ICONSTOP);

Pour cela il suffira, d'inclure le fichier .h où se trouve la fonction (InsererBitmap.h) dans votre programme, ainsi que d'inclure windows.h, richedit.h, richole.h et les librairies ole32.dll, uuid.dll. (Je pense pas en avoir oublié).

N'oubliez de mettre une petite note avec son petit commentaire associé
Merci d'avance.

Source

  • #define ZERO_FIN 1
  • /*=========================== Pour insérer une bitmap dans un RichEdit ==========================*/
  • bool InsererBitmap(HWND RichEdithWnd, HBITMAP hBitmap)
  • {
  • IDataObject * pDataObject;
  • IOleObject * pOleObject;
  • IStorage * pStorage;
  • IOleClientSite * pOleClientSite;
  • LPLOCKBYTES LPLockBytes = NULL;
  • FORMATETC FormatEtc;
  • IRichEditOle * pRichEditOle;
  • SCODE SCode;
  • REOBJECT ReObject;
  • CLSID ClSid;
  • char * Texte = "";
  • static char Texte2[] = "";
  • HGLOBAL hGlobal;
  • CoInitialize(NULL);
  • if(OpenClipboard(NULL))
  • {
  • Texte = new char[256 + ZERO_FIN];
  • Texte = (CHAR *)GetClipboardData(CF_TEXT);
  • sprintf(Texte2, "%s", Texte);
  • EmptyClipboard();
  • SetClipboardData(CF_BITMAP, hBitmap);
  • CloseClipboard();
  • }
  • else return 0;
  • hGlobal = GlobalAlloc(GMEM_DDESHARE, strlen(Texte2) + 1);
  • Texte = (CHAR *)GlobalLock(hGlobal);
  • sprintf(Texte, "%s", Texte2);
  • GlobalUnlock(hGlobal);
  • SendMessage(RichEdithWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle);
  • if (pRichEditOle == NULL) return 0;
  • OleGetClipboard(&pDataObject);
  • if (pDataObject == NULL) return 0;
  • FormatEtc.cfFormat = CF_BITMAP;
  • FormatEtc.ptd = NULL;
  • FormatEtc.dwAspect = DVASPECT_CONTENT;
  • FormatEtc.lindex = -1;
  • FormatEtc.tymed = TYMED_GDI;
  • pRichEditOle->GetClientSite(&pOleClientSite);
  • if (pOleClientSite == NULL) return 0;
  • SCode = CreateILockBytesOnHGlobal(NULL, true, &LPLockBytes);
  • if (LPLockBytes == NULL) return 0;
  • SCode = StgCreateDocfileOnILockBytes(LPLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
  • if (pStorage == NULL) return 0;
  • OleCreateStaticFromData(pDataObject, IID_IOleObject, 2, &FormatEtc, pOleClientSite, pStorage, (void**)&pOleObject);
  • if (pOleObject == NULL) return 0;
  • OleSetContainedObject(pOleObject, true);
  • ZeroMemory(&ReObject, sizeof(REOBJECT));
  • ReObject.cbStruct = sizeof(REOBJECT);
  • SCode = pOleObject -> GetUserClassID(&ClSid);
  • ReObject.clsid = ClSid;
  • ReObject.cp = REO_CP_SELECTION;
  • ReObject.dvaspect = DVASPECT_CONTENT;
  • ReObject.poleobj = pOleObject;
  • ReObject.polesite = pOleClientSite;
  • ReObject.pstg = pStorage;
  • pRichEditOle -> InsertObject(&ReObject);
  • if(OpenClipboard(NULL))
  • {
  • EmptyClipboard();
  • SetClipboardData(CF_TEXT, hGlobal);
  • CloseClipboard();
  • }
  • else return 0;
  • LPLockBytes -> Release();
  • pRichEditOle -> Release();
  • pOleObject -> Release();
  • pOleClientSite -> Release();
  • pStorage -> Release();
  • pDataObject -> Release();
  • CoUninitialize();
  • return 1;
  • }
#define ZERO_FIN    1
/*=========================== Pour insérer une bitmap dans un RichEdit ==========================*/
bool InsererBitmap(HWND RichEdithWnd, HBITMAP hBitmap)
{
    IDataObject * pDataObject;
    IOleObject * pOleObject;
    IStorage * pStorage;
    IOleClientSite * pOleClientSite;
    LPLOCKBYTES LPLockBytes = NULL;
    FORMATETC FormatEtc;
    IRichEditOle * pRichEditOle;
    SCODE SCode;
    REOBJECT ReObject;
    CLSID ClSid;
    char * Texte = "";
    static char Texte2[] = "";
    HGLOBAL hGlobal;

    CoInitialize(NULL);
    if(OpenClipboard(NULL))
    {
        Texte = new char[256 + ZERO_FIN];
        Texte = (CHAR *)GetClipboardData(CF_TEXT);
        sprintf(Texte2, "%s", Texte);
        EmptyClipboard();
        SetClipboardData(CF_BITMAP, hBitmap);
        CloseClipboard();
    }
    else return 0;

    hGlobal = GlobalAlloc(GMEM_DDESHARE, strlen(Texte2) + 1);
    Texte = (CHAR *)GlobalLock(hGlobal);
    sprintf(Texte, "%s", Texte2);
    GlobalUnlock(hGlobal);

    SendMessage(RichEdithWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle);
    if (pRichEditOle == NULL) return 0;

    OleGetClipboard(&pDataObject);
    if (pDataObject == NULL) return 0;

    FormatEtc.cfFormat = CF_BITMAP;
	FormatEtc.ptd = NULL;
	FormatEtc.dwAspect = DVASPECT_CONTENT;
	FormatEtc.lindex = -1;
	FormatEtc.tymed = TYMED_GDI;

    pRichEditOle->GetClientSite(&pOleClientSite);
    if (pOleClientSite == NULL) return 0;

    SCode = CreateILockBytesOnHGlobal(NULL, true, &LPLockBytes);
    if (LPLockBytes == NULL) return 0;

    SCode = StgCreateDocfileOnILockBytes(LPLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
    if (pStorage == NULL) return 0;

    OleCreateStaticFromData(pDataObject, IID_IOleObject, 2, &FormatEtc, pOleClientSite, pStorage, (void**)&pOleObject);
    if (pOleObject == NULL) return 0;

    OleSetContainedObject(pOleObject, true);

    ZeroMemory(&ReObject, sizeof(REOBJECT));
    ReObject.cbStruct = sizeof(REOBJECT);

    SCode = pOleObject -> GetUserClassID(&ClSid);

    ReObject.clsid = ClSid;
    ReObject.cp = REO_CP_SELECTION;
    ReObject.dvaspect = DVASPECT_CONTENT;
    ReObject.poleobj = pOleObject;
    ReObject.polesite = pOleClientSite;
    ReObject.pstg = pStorage;

    pRichEditOle -> InsertObject(&ReObject);

    if(OpenClipboard(NULL))
    {
        EmptyClipboard();
        SetClipboardData(CF_TEXT, hGlobal);
        CloseClipboard();
    }
    else return 0;

    LPLockBytes -> Release();
    pRichEditOle -> Release();
    pOleObject -> Release();
    pOleClientSite -> Release();
    pStorage -> Release();
    pDataObject -> Release();

    CoUninitialize();

    return 1;
}

 Conclusion

Je remercie énormément Christian ASTOR qui a fait une grosse base de cette fonction.
Moi je l'ai juste adaptée pour la simplifier et la clarifier.
Envoyez les commentaires, et soyez constructif (et indulgent c'est ma 1ère source en C++).

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

27 décembre 2004 11:01:26 :
Cette mise à jour permet de minimiser le nombre de variables utilisées. J'ai également réduit le code le plus possible à l'essentiel. Mais le fait qu'on ne puisse pas réutiliser 2 fois le même bitmap pendant l'exécution d u programme n'est toujours pas corrigé. Donc si vous avez des propositions là-dessus, je suis preneur.
13 février 2005 10:06:23 :
Cette mise à jour stocke le texte présent dans le presse-papiers pendant l'opération puis le remet dedans à la fin. Avant le presse-papiers était systématiquement effacé, quelque soit son contenu.

 Sources du même auteur

Source avec Zip Source avec une capture YOYODOWN - TÉLÉCHARGEMENT HTTP [DEV-C++ 4.9.9.2]
Source avec Zip Source avec une capture YOYOMD5 - CALCUL ET AFFICHAGE DE LA CLEF MD5 D'UN FICHIER
Source avec une capture SCANNER DE DISQUES (RECURSIF)
Source avec Zip Source avec une capture TRACÉ DE COURBES À PARTIR D'UN FICHIER TEXTE (GDI)
Source avec Zip Source avec une capture YOYOCUT 2 - DÉCOUPE FICHIER [VISUAL C++ 2005 EXPRESS]

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

Commentaires et avis

Commentaire de Nebula le 23/12/2004 01:20:13

Très sympa (après petite adaptation pour compiler en C et pouvoir tester). Mais y'a pas moyen de le faire sans monopoliser le presse-papiers ?

Et aussi, il serait plus sûr de distribuer un couple .h/.c pour éviter la déclaration multiple de la fonction, si on inclus le .h dans plusieurs fichiers.

Commentaire de yoyo269 le 23/12/2004 09:57:59

Merci Nebula de ton commentaire.

Je pense que c'est possible d'éviter le presse-papier.
J'y regarde et je te tiens au courant.

Pour ce qui est du couple .c/.h j'y avais pas pensé mais je pense que chacun saura adapté ce code à son projet.

P.S: Mettez une petite note s'il vous plait.

YOYO, @+.

Commentaire de yoyo269 le 23/12/2004 10:10:31

Je viens de regarder dans MSDN pour le presse-papiers et on dirait qu'on a pas le choix (à moins que je me trompe).

YOYO, @+.

Commentaire de Gendal67 le 23/12/2004 11:05:19

Eh, mais c'est pas drole!!! tu n'as même pas mis le mesenger dedans!!! snifff!! il n'y a qu'un fichier .h, c pas drole du tout ça!!! snifff!!!

Commentaire de yoyo269 le 23/12/2004 11:14:40

Désolé Gendal67 mais il est en cours de conception.
Peut-être que quand il sera fini il sera sur cppfrance.
:D

YOYO, @+.

Commentaire de Nebula le 23/12/2004 15:32:31

Pour la note, c'est justement cette histoire avec le presse-papiers qui me retenait, je trouve çà ballot (ma vision des choses est qu'un programme ne doit pas utiliser le presse papiers, sauf demande expresse de l'utilisateur). Là le code est bien mais pourrait être mieux, donc je vais encore attendre... Le screen est sympa, en tout cas ;-)

Commentaire de yoyo269 le 23/12/2004 16:23:09

Merci Nebula,

mais j'ai regardé et apparemment on peut pas éviter le presse-papiers.
Je sais c'est pas la meilleure méthode mais on dirait que c'est la seule, jusqu'à preuve du contraire.

En tout cas si qq'un trouve un moyen sans passer par le presse-papiers je suis preneur.

YOYO, @+.

Commentaire de yoyo269 le 24/12/2004 09:44:00

Vu 138 et tjs aucune note.
Allez les gars (et les filles) soyez sympa, faites un petit effort.

YOYO, @+.

Commentaire de Gendal67 le 24/12/2004 13:20:05

"Désolé Gendal67 mais il est en cours de conception.
Peut-être que quand il sera fini il sera sur cppfrance.
:D
"  <<< lol, comment ça "peut-etre" ? lol, moi jtroverais normal qu'il y soit!! faut en faire profiter tout le monde...surtout que pour le créer, tu as eu besoin d'aide sur cppfrance...:-))

Commentaire de yoyo269 le 05/02/2005 11:54:35

J'ai trouvé la solution à mon petit problème pour pouvoir mettre plusieurs fois le même HBITMAP dans un richedit.
Si certains veulent savoir comment j'ai fait, qu'ils me contactent, je leur répondrai avec plaisir.

YOYO, @+.

Commentaire de yoyo269 le 13/02/2005 10:08:08

Voilà une nouvelle mise à jour.
Une petite correction au niveau du presse-papier.

YOYO, @+.

Commentaire de yoyo269 le 18/02/2005 22:50:04

Quand vous mettez des sales notes mettez au moins un commentaire.
Ca serait bien que BruNews change ça.
Mettre un commentaire pour pouvoir mettre une note.
Sinon ya des petits malins qui s'amusent à mettre des caisses.

YOYO, @+.

Commentaire de victorcoasne le 01/05/2005 19:40:23

Très bien 10/10 !

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales