Bilder in RichEdit per Copy & Paste einfügen.



  • Hallo,

    grundsätzlich ist es ja kein Problem Bilder in ein RTF-Ctrl einzufügen. Man lädt ein beliebiges Bild und fügt mit Hilfe eines HBITMAP dieses ein. Das funktioniert auch problemlos.

    Bsp:

    STGMEDIUM stgm; ::ZeroMemory(&stgm, sizeof(STGMEDIUM));
    stgm.tymed = TYMED_GDI;
    stgm.hBitmap = hBitmap;
    stgm.pUnkForRelease = NULL;
    
    COleDataSource *pDataSource = new COleDataSource;
    pDataSource->CacheData(CF_BITMAP, &stgm, &fmt);
    IDataObject* pDataObject = (IDataObject*)pDataSource->GetInterface(&IID_IDataObject);
    
    pRichEditCtrl->GetIRichEditOle()->ImportDataObject(pDataObject, CF_BITMAP, 0);
    

    Damit das nun aber immer (Copy & Paste / Drag 'n Drop) funktioniert, macht man eine Implementation von IRichEditOleCallback::QueryAcceptData. Nur wenn man obigen Code darin ausführt, funktioniert es nicht mehr. Evtl. hängt das mit dem Rückgabewert zusammen

    Lt. MSDN:
    On failure, the rich edit control refuses the data and terminates the operation. Otherwise, the control checks the data itself for acceptable formats. A success code other than S_OK means that the callback either checked the data itself (if fReally is FALSE) or imported the data itself (if fReally is TRUE). If the application returns a success code other than S_OK, the control does not check the read-only state of the edit control.

    Was ist ein "success code other than S_OK"? Oder ist der Weg über IRichEditOleCallback::QueryAcceptData falsch?

    Danke und Grüße
    Karl


  • Mod

    Gärtner schrieb:

    Was ist ein "success code other than S_OK"? Oder ist der Weg über IRichEditOleCallback::QueryAcceptData falsch?

    ImportDataObject liefert einen HRESULT Code. Der ist eben S_OK, wenn alles klar ist oder eben en Fehlercode.



  • Hallo,

    Martin Richter schrieb:

    ImportDataObject liefert einen HRESULT Code. Der ist eben S_OK, wenn alles klar ist oder eben en Fehlercode.

    Irgendwie stehe ich auf dem Schlauch. Ich übersetze das so, dass es noch mehrere Erfolgsmeldungen außer S_OK gibt, also S_OK_1, S_OK_2 usw..

    Bei IRichEditOle::ImportDataObject ist das eindeutig entweder S_OK oder halt Fehler, bei IRichEditOleCallback::QueryAcceptData steht das anders.

    IRichEditOleCallback::QueryAcceptData verhält sich so:
    S_OK:
    RTF-Control übernimmt die Arbeit, das Bild ist als Datei mit Icon importiert.
    S_FALSE:
    Es passiert nichts. Es ist ein Fehler aufgetreten
    S_???:
    Ich habe das selbst gemacht.

    😕 .

    Danke und Grüße


  • Mod

    Bei einem HRESULT ist nur das ein Fehler was das höchste Bit an hat, also S_OK ist erfolg, S_FALSE ist Erfolg, End fo Record set und alles mögliche andere ist ein Wert bei dem SUCCEEDED true liefert!


Anmelden zum Antworten