none
How load an image from URL c++/cLI RRS feed

  • 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.

    viernes, 23 de julio de 2010 14:07

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 el  
    estado 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
    martes, 27 de julio de 2010 19:34
    Moderador

Todas las respuestas

  • Perhaps this can help you:

    http://social.msdn.microsoft.com/forums/en-US/vssmartdevicesvbcs/thread/e8165f5e-e716-41a2-9a98-049a63217993

    http://www.c-sharpcorner.com/UploadFile/bfarley/simplewebfiledownload11162005015304AM/simplewebfiledownload.aspx 

    They 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/
    sábado, 24 de julio de 2010 10:26
    Moderador
  • 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.

    lunes, 26 de julio de 2010 12:16
  • 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
    martes, 27 de julio de 2010 15:07
    Moderador
  • 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.

    martes, 27 de julio de 2010 16:58
  • La mejor solución que veo para eso es que en la creación del d iálogo  
    inicies un thread que se encargue de cargar la imagen. Una vez que el hi lo  
    la tenga, si estás en .NET usas el Invoke del form para llamar a un   
    Delegado al que le pasas el bitmap, y ese delegado lo muestra en el  
    diá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 do  
    el tema. La variable del bitmap puede ser sin problemas un miembro de la   
    clase diálogo, pero no la toques hasta que no hayas recibido el men saje o  
    se 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/
    martes, 27 de julio de 2010 19:29
    Moderador
  • 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 el  
    estado 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
    martes, 27 de julio de 2010 19:34
    Moderador
  • 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.

    miércoles, 28 de julio de 2010 14:13