 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Vanessa Invitado
|
Publicado: Vie 15 Nov, 2002 3:07 am Asunto: Insertar Imágenes en RichEdit |
|
|
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 ==> 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 17 Nov, 2002 3:32 am Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 07 Oct, 2004 10:20 pm Asunto: |
|
|
Al intentar compilar me da errores :
| 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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Jue 07 Oct, 2004 10:58 pm Asunto: |
|
|
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 , 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 |
|
 |
TObject Cdt

Registrado: 28 Jun 2004Mensajes: 17
|
Publicado: Vie 29 Oct, 2004 5:23 pm Asunto: |
|
|
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 |
|
 |
_Willa Capt


Registrado: 28 Ago 2002Mensajes: 169Ubicación: Madrid ( España )
|
Publicado: Vie 29 Oct, 2004 5:49 pm Asunto: |
|
|
_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
~~~~~~~~
_Willa
~~~~~~~~
www.avancegame.com |
|
| Volver arriba |
|
 |
cecito Capt

Registrado: 25 Nov 2003Mensajes: 164Ubicación: Arequipa - Perú
|
Publicado: Vie 29 Oct, 2004 6:09 pm Asunto: |
|
|
_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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Sab 24 Ene, 2009 4:41 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 15 Mar, 2017 1:27 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 15 Mar, 2017 3:10 pm Asunto: |
|
|
| 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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 17 Mar, 2017 1:21 pm Asunto: |
|
|
¿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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 17 Mar, 2017 5:59 pm Asunto: |
|
|
| _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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Lun 24 Sep, 2018 2:37 am Asunto: |
|
|
| _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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|