Mettre un hbitmap dans un richedit

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

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.