Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Insertar Imágenes en RichEdit

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Insertar Imágenes en RichEdit Responder citando

Hola a todos !!!

Kisiera saber si alguien me puede ayudar a instar imagenes en un Rich Edit, es decir, yo kiero ke a mi RchEdit aparte de texto puedan agregarsele algunas imágenes, precisamente como es hace en este.. yo eligo una imagen y la agergo asi ==> Wink el algoritmo para barrer el texto y saber donde se colca una imagen no hay problema.. las buskedas las se hace muy bien.. mi unica duda es ke instuccion me permite agregar alguna imagen al RichEdit..

Gracias a todos..

Chao
Volver arriba
Mensaje    Asunto: Responder citando

Hola:

Aquí va una rutina que he sacado de un ejemplo para Visual C++, pero que funciona sin cambiar nada en C++Builder:

Antes que nada tienes que añadir las siguientes cabeceras y en el mismo orden que ves:
    #include<ole2.h>
    #include<richole.h>

Código:
int InsertBitmap(HWND rEdit,char *lpszA)
{
    LPRICHEDITOLE   m_pRichEditOle;
    LPOLEOBJECT     m_lpObject;
    LPSTORAGE       m_lpStorage;
    LPOLECLIENTSITE m_lpClientSite;

    ::SendMessage((HWND)rEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&m_pRichEditOle);
    if (m_pRichEditOle == NULL)
        return false;

    // Create the embedded object

    LPLOCKBYTES lpLockBytes = NULL;

    CLSID clsid = CLSID_NULL;
    //OLERENDER render = OLERENDER_DRAW;
    CLIPFORMAT cfFormat = 0;
    LPFORMATETC lpFormatEtc = new FORMATETC;
    SCODE sc;

    sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    if (sc != S_OK)
        return false;

    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
    STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &m_lpStorage);
    if (sc != S_OK)
        return false;

    // To convert an ANSI string lpszA to a Unicode string lpszW

    int nLen = ::MultiByteToWideChar(CP_ACP, 0, lpszA, -1, NULL, NULL);

    LPWSTR lpszFileName = new WCHAR[nLen];

    ::MultiByteToWideChar(CP_ACP, 0, lpszA, -1, lpszFileName, nLen);

    // use lpszW here

    // fill in FORMATETC struct FORMATETC formatEtc; lpFormatEtc = &formatEtc;
    lpFormatEtc->cfFormat = cfFormat;
    lpFormatEtc->ptd = NULL;
    lpFormatEtc->dwAspect = DVASPECT_CONTENT;
    lpFormatEtc->lindex = -1;
    lpFormatEtc->tymed = (DWORD)-1; // attempt to create the object
    m_pRichEditOle->GetClientSite(&m_lpClientSite);
    sc = ::OleCreateFromFile(clsid, (LPCOLESTR)lpszFileName,
            IID_IUnknown, OLERENDER_NONE, lpFormatEtc,
            m_lpClientSite, m_lpStorage, (void**)&m_lpObject);

    if (sc != S_OK)
    {
        char lpMsgBuf[10000];
        ::FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL,
            ::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf, 10000, NULL );
        MessageBox( 0, lpMsgBuf,"Error", MB_OK );
        return false;
    }

    // m_lpObject is currently an IUnknown, convert to IOleObject
    if (m_lpObject != NULL)
    {
        LPUNKNOWN lpUnk = m_lpObject;
        lpUnk->QueryInterface(IID_IOleObject, (void**)&m_lpObject);
        lpUnk->Release();
        if (m_lpObject == NULL)
        return false;
    }
    // all items are "contained" -- this makes our reference to this object
    //  weak -- which is needed for links to embedding silent update.
    OleSetContainedObject(m_lpObject, TRUE);

    // 3 . Ready !
    REOBJECT reobject;
    ZeroMemory(&reobject, sizeof(REOBJECT));
    reobject.cbStruct = sizeof(REOBJECT);

    sc = m_lpObject->GetUserClassID(&clsid);
    if (sc != S_OK)
    return false;
    reobject.clsid = clsid;
    reobject.cp = REO_CP_SELECTION;
    reobject.dvaspect = DVASPECT_CONTENT;
    reobject.dwFlags = REO_RESIZABLE | REO_BELOWBASELINE;
    reobject.dwUser = 0;
    reobject.poleobj = m_lpObject;
    reobject.polesite = m_lpClientSite;
    reobject.pstg = m_lpStorage;
    SIZEL sizel;
    sizel.cx = sizel.cy = 0;
    reobject.sizel = sizel;

    // 4 . Insert
    m_pRichEditOle->InsertObject(&reobject);

    delete []lpszFileName;
    return true;
}

Y para probarla, añade al Form un TRichEdit (RichEdit1) y un TButton (Button1) y en el OnClick del botón algo así:

    // Esto inserta un .bmp en un RichEdit en la posición donde este el cursor
    InsertBitmap(RichEdit1->Handle, "C:\\tuDir\\tuImagen.bmp");

Y si necesitas algo más completo te recomiendo que visites la siguiente dirección, la cual esta dedicada exclusivamente al RichEdit:
http://home.att.net/~robertdunn/Yacs.html
Más concretamente busca dentro de esa página el tema:
"Add OLE functionality to TRichEdit"

Saludos:
_Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Al intentar compilar me da errores Crying or Very sad :
Código:

  [C++ Error] richole.h(111): E2293 ) expected
  [C++ Error] richole.h(148): E2293 ) expected
  [C++ Error] richole.h(153): E2303 Type name expected


¿Alguien sabe a qué es debido, o si existe otra forma de insertar una imagen en un TRichEdit?
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno... el problema anterior ya lo he solucionado, simplemente he cambiado el orden de los #include y ya compila correctamente. Sólo que ahora me ha surgido otro Embarassed , y es que cuando intento insertar el bitmap me sale un mensaje diciendo "Se ha intentado hacer referencia a un símbolo que no existe". A ver si alguien me puede echar una manita.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Funciona correctamente la insercion de la imagen ..... sólo tengo una pregunta .....
¿Cómo libero la memoria utilizada por la imagen sin destruir el RichEdit?

Me gustaria entrar al link que compartes pero .... aqui en mi trabajo únicamente tengo salida para el foro ....

de antemano le agradeceria a quien contestará la pregunta.


Ultima edición por TObject el Vie 29 Oct, 2004 5:57 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

_Leo,

Funciona bien, pero mi duda es, se puede tener control sobre
algun evento de las imagenes introducidas, es decir,
si pulso sobre alguna de las imagenes introducidas esta
puede generarme el eventoclick por ejemplo.

Hasta Luego!!
_________________
Saludos
~~~~~~~~
Wink _Willa
~~~~~~~~
www.avancegame.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

_Leo, como sería para hacer el proceso contrario, osea ya tengo varias imagenes incrustadas en el ritchedit lo que deseo es obtener cada una de ellas tal vez dentro de un objeto image .

¿Como sería para poder insertar cualquier otro objeto (en particular el editor de ecuaciones) dentro de la posición del cursor y como se haria para obtener una "imagen" del objeto insertado?

¿Como hacer para que la imagen insertada responda al Click?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

la imagane como bien dicta _Leo se agrega en el richedit , por lo menos he probado los formatos jpg y bmp, lo que tengo el sigiuiente inconveniente , una imagen bmp se ve en el richedit, pero una de tipo jpg no se ve pero esta he incluido incluso
#include <jpeg> y nada , hay alguna solucion para esto?
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Vale: es de hace bastantes años pero me hace falta.
_Leo escribió:
Aquí va una rutina que he sacado de un ejemplo para Visual C++, pero que funciona sin cambiar nada en C++Builder:

Antes que nada tienes que añadir las siguientes cabeceras y en el mismo orden que ves:
    #include<ole2>
    #include<richole>

Estaba viendo y probando este código en BCB6.
1. Si pongo las cabeceras así:
Cita:
#include <vcl>
#include<ole2>
#include<richole>
#pragma hdrstop

Al compilar salen los mensajes que señalaba Tugui en su comenatrio.
2. Si invierto el orden:
Cita:
#include <vcl>
#include<richole>
#include<ole2>
#pragma hdrstop

entonces aparecen otros muchos:
Cita:

[C++ Error] richole.h(23): E2303 Type name expected
[C++ Error] richole.h(23): E2139 Declaration missing ;
[C++ Error] richole.h(25): E2303 Type name expected
[C++ Error] richole.h(25): E2139 Declaration missing ;
[C++ Error] richole.h(94): E2293 ) expected
[C++ Error] richole.h(111): E2293 ) expected
[C++ Error] richole.h(137): E2293 ) expected
[C++ Error] richole.h(143): E2293 ) expected
[C++ Error] richole.h(148): E2293 ) expected
[C++ Error] richole.h(152): E2303 Type name expected

3. Y si las pongo así:
Cita:
#include<ole2>
#include<richole>
#include <vcl>
#pragma hdrstop

Entonces salen otros errores diferentes:
Cita:
[C++ Error] richole.h(111): E2293 ) expected
[C++ Error] richole.h(148): E2293 ) expected
[C++ Error] richole.h(153): E2303 Type name expected
[C++ Error] winsock2.h(109): E2238 Multiple declaration for 'fd_set'
[C++ Error] winsock.h(54): E2344 Earlier declaration of 'fd_set'
[...]
[C++ Error] winsock.h(492): E2228 Too many error or warning messages

¿Alguien ha logrado que esto le funcione?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel escribió:
Vale: es de hace bastantes años pero me hace falta.

Añade esas cabeceras debajo de todas las demás, en un proyecto vacío seria debajo de: #include "Unit1.h"
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:
Añade esas cabeceras debajo de todas las demás, en un proyecto vacío seria debajo de: #include "Unit1.h"

¡Perfecto! Muchas gracias.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

¿Por casualidad no tendrás instalados los componentes RXLIB que se usaban mucho hace años? En ella tienes un RichEdit mejorado para trabajar más fácilmente con imágenes.

Con el RichEdit que viene de fábrica para hacerlo hay que añadir mucho código, no solo para insertar una imagen, sino además de eso para que luego al cargar un archivo .RTF vuelva a mostrar las imágenes que contiene, o para saber cuándo esta seleccionada una imagen y obtener información sobre ella, etc.

Es una pena que Embarcadero (y Borland en su momento) solo implementara las funcionalidades de la versión 1 del control del sistema que encapsula. Casi en cada versión nueva de Windows, Microsoft ha ido añadiéndole funcionalidades y es un control con una barbaridad de opciones, pero desgraciadamente Embarcadero lo abandono hace años.

La web que estaba dedicada a ese control que aparece más arriba ya no existe, pero alguien ha puesto una copia de la misma en el siguiente enlace, es bastante vieja, pero tiene cosas bastante interesantes si uno quiere conocer mejor ese control:

http://yacs.lebeausoftware.org
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:
¿Por casualidad no tendrás instalados los componentes RXLIB que se usaban mucho hace años? En ella tienes un RichEdit mejorado para trabajar más fácilmente con imágenes.

No, seguro que no. En este momento tengo una instalación deBCB 6 limpia ya que ni siquiera he instalado LMDTools.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

_Leo escribió:
¿Por casualidad no tendrás instalados los componentes RXLIB que se usaban mucho hace años? En ella tienes un RichEdit mejorado para trabajar más fácilmente con imágenes.

Con el RichEdit que viene de fábrica para hacerlo hay que añadir mucho código, no solo para insertar una imagen, sino además de eso para que luego al cargar un archivo .RTF vuelva a mostrar las imágenes que contiene, o para saber cuándo esta seleccionada una imagen y obtener información sobre ella, etc.

Es una pena que Embarcadero (y Borland en su momento) solo implementara las funcionalidades de la versión 1 del control del sistema que encapsula. Casi en cada versión nueva de Windows, Microsoft ha ido añadiéndole funcionalidades y es un control con una barbaridad de opciones, pero desgraciadamente Embarcadero lo abandono hace años.

La web que estaba dedicada a ese control que aparece más arriba ya no existe, pero alguien ha puesto una copia de la misma en el siguiente enlace, es bastante vieja, pero tiene cosas bastante interesantes si uno quiere conocer mejor ese control:

http://yacs.lebeausoftware.org


He descubierto que hay otro trabajo que guarda una copia de los sitios:

https://web.archive.org/

En el caso de este sitio:

https://web.archive.org/web/20070827015359/http://home.att.net:80/~robertdunn/Yacs.html
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.