Mettre un hbitmap dans un richedit

Soyez le premier à donner votre avis sur cette source.

Vue 4 959 fois - Téléchargée 310 fois

Description

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 / Exemple :


#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++).

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
Très bien 10/10 !
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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, @+.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Voilà une nouvelle mise à jour.
Une petite correction au niveau du presse-papier.

YOYO, @+.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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, @+.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
2
"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...:-))
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.