Principales respuestas
How load an image from URL c++/cLI

Pregunta
-
Hello, i am using a mixed code, and i need to implement on a CDialog something similar to Picture Box, but i only have a url of the image that i need to display .i.e. "\\192.168.240.94\\pics\image.jpg"
I´ve been searching for a while and i found that the best way to do this is implementing a method thats "create" the birmap from the url, on a hbitmap or something else.
i have tried to use the System::Net:HttpWebRequest but thought i set the system::net namespace and the .net reference to my project, the compiler doesn´t not recognize the httpwebrequest as a method derived from System::Net, in fact, intellisense doesn´t not show anything else but two members named IPEndPointConnection and PeerToPeer derived from System::Net.
Can U help me?
thanks in advance and sorry for my English.
Respuestas
-
On Tue, 27 Jul 2010 21:29:39 +0200, RFOG <no@mail.com> wrote:> Delegado al que le pasas el bitmap, y ese delegado lo muestra en el> diálogo.O declaras una variable bool volátil y cuando el bitmap esté, cambias elestado y dejas al hilo morir. También vale para la versión MFC o nativa...aunque en un multicore podría darte algún quebradero de cabeza ...--Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog======================== =============== No hay enemigo pequeño.
MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/- Marcado como respuesta Chriss Rojas miércoles, 28 de julio de 2010 14:13
Todas las respuestas
-
Perhaps this can help you:
http://social.msdn.microsoft.com/forums/en-US/vssmartdevicesvbcs/thread/e8165f5e-e716-41a2-9a98-049a63217993They are in C# but can be easily converted into C++/CLI.
NOTE: This is a Spanish writing forum. If you speaks Spanish better for all of us, but if you don't perhaps the next forums will be better for you:
http://social.msdn.microsoft.com/Forums/en-US/category/visualc
MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/ -
Hi RFOG,
In Fact, i implemented a HttpWebRequest method for downloading the image from URL, but my problem now, is "how to show it" because in mixed code, i only have access to a Picture Control, and the response of the method mentioned above is System::Drawing:Image, Do you know how to dynamic cast it to a hbitmap or something else?
No me habia percatado de que el foro fuera en Español, pense que solo era un traductor automático del site, he implementado (como arriba mencione) un metodo con HttpWebRequest, el cual tiene algunos artificios para hacer que funcione, sin embargo la salida de este metodo es de tipo manejado, "System::Drawing::Image, y no se como indicarle a un control de tipo nativo como Picture Control que el source sea de este tipo, tienes alguna idea de como castearlo?
Se que mediante "marshal" (por ejemplo), el cual es dependiente de interop services, es posible castear un System::String ^ de codigo manejado hacia un char * en codigo nativo, por lo cual me supongo que debe de existir algo para un handle de imagen.
Thanks in advance!
Gracias de antemano.
Saludos.
-
El bitmap de la clase manejada debe tener un handle del tipo HBITMAP, que el que podrías usar para hacer la copia a un bitmap nativo (o usar directamente dicho handle), pero la verdad es que no encuentro la forma.
Una manera un poco bruta es la de bloquear los bits del bitmap manejado con LockBits() y luego acceder a dichos bits y copiarlos a un bitmap nativo...
Y la que menos me gusta es la de guardarlo en disco (en la carpeta de temporales) y cargarlo como nativo...
De todos modos, teniendo los dos bitmaps (el nativo y el manejado), podrías copiar uno sobre otro:
http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.unlockbits.aspx
Lo cierto es que al revés es casi trivial, pero de manejado a nativo...
MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/- Editado RFOGModerator martes, 27 de julio de 2010 15:17 Completar respuesta
-
Hola RFOG, pues he logrado mostrar el bitmap utilizando las fuentes del mismo archivo, para lo cual no explicare a menos que se requiera ya que no es el problema principal al que me he posteado.
el último problema es el siguiente:
Debido a que se mostrara en una aplicaicion similar al messenger, el cual descargara la fotografia del contacto desde una URL en un servidor de usuarios, la latencia de descarga de estas imagenes se nota en la misma carga del dialogo, ya que se ejecuta desde un initdialog(),
Necesito poder realizar esta descarga de un modo asincrono, de modo que el initdialog termine de crear la ventana y posteriormente que se descarge la imagen, esta se muestre sobre el control de imagen.
Lo solucionado hasta ahora es:
Creacion de los controles del dialog.
Carga de la imagen a un handle
"pintado" de la imagen en un control
lo no solucionado es: carga de la imagen en un evento asincrono.
Me he dado un vistazo por la documentacion del BeginGetRequestStream, sin embargo no he tenido una solucion fructifera, ha alguien hecho algo asi?
Saludos y gracias de antemano.
-
La mejor solución que veo para eso es que en la creación del d iálogoinicies un thread que se encargue de cargar la imagen. Una vez que el hi lola tenga, si estás en .NET usas el Invoke del form para llamar a unDelegado al que le pasas el bitmap, y ese delegado lo muestra en eldiálogo.Si estás en nativo, que el hilo le envíe un mensaje personaliz ado(WM_USER+loquesea) al diálogo informándole que el bitamp ya es válido.En ambos casos el hilo termina cuando haya obtenido la imagen y notifica doel tema. La variable del bitmap puede ser sin problemas un miembro de laclase diálogo, pero no la toques hasta que no hayas recibido el men saje ose ejecute el delegado.On Tue, 27 Jul 2010 18:58:51 +0200, Chriss <Rojas> wrote:> Hola RFOG, pues he logrado mostrar el bitmap utilizando las fuentes de l> mismo> archivo, para lo cual no explicare a menos que se requiera ya que no e s> el> problema principal al que me he posteado.>> el último problema es el siguiente:>> Debido a que se mostrara en una aplicaicion similar al messenger, el c ual> descargara la fotografia del contacto desde una URL en un servidor de> usuarios,> la latencia de descarga de estas imagenes se nota en la misma carga de l> dialogo,> ya que se ejecuta desde un initdialog(),>> Necesito poder realizar esta descarga de un modo asincrono, de modo qu e> el> initdialog termine de crear la ventana y posteriormente que se descarg e> la> imagen, esta se muestre sobre el control de imagen.>> Lo solucionado hasta ahora es:>> Creacion de los controles del dialog.>> Carga de la imagen a un handle>> "pintado" de la imagen en un control>> lo no solucionado es: carga de la imagen en un evento asincrono.>> Me he dado un vistazo por la documentacion del BeginGetRequestStream, sin> embargo no he tenido una solucion fructifera, ha alguien hecho algo as i?>> Saludos y gracias de antemano.--Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog======================== =============== No hay enemigo pequeño.
MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/ -
On Tue, 27 Jul 2010 21:29:39 +0200, RFOG <no@mail.com> wrote:> Delegado al que le pasas el bitmap, y ese delegado lo muestra en el> diálogo.O declaras una variable bool volátil y cuando el bitmap esté, cambias elestado y dejas al hilo morir. También vale para la versión MFC o nativa...aunque en un multicore podría darte algún quebradero de cabeza ...--Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog======================== =============== No hay enemigo pequeño.
MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/- Marcado como respuesta Chriss Rojas miércoles, 28 de julio de 2010 14:13
-
Hola, pues he logrado vencer el reto, he diseñado un dialogo que cargue los controles en codigo nativo y que por medio de un metodo en codigo manejado, descarge mediante un thread asyncrono ciertas imagenes (pueden ser cualquier cosa) desde una url, hacia un handle nativo temporal, el cual mediante un reflejo del thread en el momoento que termine le avise a la ventana y ésta muestre la imagen.
Para esto he utilizado una clase contenida de tipo manejada dentro de una clase nativa, la cual tiene un handle que direcciona a un metodo el cual absorvera la respuesta de un thread. algo asi como esto:
ref class Singleton;
gcroot<Singleton^> m_singleton;
Singleton^ get_singleton(CMessageDialog* m_pNativeTarget){
if((Singleton^)m_singleton == nullptr){
m_singleton = gcnew Singleton(m_pNativeTarget);
}
return (Singleton^)m_singleton;
}
ref class Singleton
{
//native pointer to main CDialog
CMessageDialog *m_pNativeTarget;
//constructor
public: Singleton(CMessageDialog * clsPtr):m_pNativeTarget(clsPtr){}
public: void OnCompleted(System::Object ^sender, System::ComponentModel::AsyncCompletedEventArgs ^e){
this->m_pNativeTarget->OnCompleted(sender,e);
}
};
};
Si alguien tiene una duda de como utilizar un handle manejado dinámico del tipo:
WebClient^ webClient = gcnew WebClient;
webClient->DownloadFileCompleted += gcnew System::ComponentModel::AsyncCompletedEventHandler(get_singleton(this),&Singleton::OnCompleted);
Con gusto ayudare, solo posteen por este medio o envien un correo a christian.rojas@hot...
mil gracias por la ayuda RFOG.
Saludos.