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 

Es posible Usar Imagen Gif rotando como proceso en espera

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Es posible Usar Imagen Gif rotando como proceso en espera Responder citando

Hola

Trabajo en CB6 y se me ha ocurrido que mientras el programa realiza una operacion larga sustituir la tipica barra de espera por una imagen como esta

[img]https://app.box.com/s/54qhbb7wu6gztnnyw0fr[/img]

rotando.

Implementando el codigo siguiente el resultado se aproxima a lo que quiero

Código:
void __fastcall TTFEspera::FormActivate(TObject *Sender)
{
   for(int i=1;i<???;i++)
     {
        Rotar();
        for(int i=1;i<50000000>Picture->Bitmap = NULL;
        Application->ProcessMessages();
     }
}


void TTFEspera::Rotar()
{

     Graphics::TBitmap *bmpOriginal = new Graphics::TBitmap();
     //bmpOriginal->LoadFromResourceName(0,"bmpcrug");
     bmpOriginal->LoadFromFile("Reloj.bmp");

     Img->Picture->Assign(bmpOriginal);

     Graphics::TBitmap *bmpCopy = new Graphics::TBitmap();

     bmpCopy->Width  = bmpOriginal->Height;
     bmpCopy->Height = bmpOriginal->Width;

     int wOr = bmpOriginal->Width, hOr = bmpOriginal->Height;

     for(int x = 0; x < wOr; x++)
      {
        for(int y = 0; y <hOr>Canvas->Pixels[hOr - y][x] = bmpOriginal->Canvas->Pixels[x][y];
         }
      }


    bmpCopy->SaveToFile("Dibujo.bmp");

    delete bmpOriginal; bmpOriginal=NULL;
    delete bmpCopy; bmpCopy = NULL;

    Application->ProcessMessages();
}



Pero resultaria mucho mas estetico si la imagen en vez de un bmp fuera un GIF Transparente

Buscando he encontrado que Leo(como no ) ha implementado una forma de cargar un Gif en un TIMAGEN

https://cppbuilder.es/viewtopic.php?t=4260&highlight=cargar+gif+timage


Mi pregunta:es posible Girar (y guardar la imagen girada) con la imagen Gif como hago con la imagen bmp..

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

Hya un elemento en las paletas de Builder que es el TAnimate que vale para mostrar un AVI. ¿Por qué no pruebas con él? En la red es fácil encontrar recursos con animaciones de relojes, por ejemplo.
_________________
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

Gracias por contestar..estudiare el tema.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Buenas...

He retomado el tema de girar un gif transparenete cargado en un TImage y he gado a un callejon sin salida (para mi).. El planteamiento es el siguiente cargo una imagen gif en un Timage (gracias Leo) lo roto 90º (gracias otra vez Leo) guardo la imagen rotada con el mismo nombre, la cargo en el Timage,la roto y asi sucesivamente...

La primera parte funciona o eso creo...

While...
{
pathFich = pathFich + "RelojTemp.gif";
CargarImagen(img,pathFich);
RotarImagen(img, true)
Img->Picture->Assign(NULL);
}

Código:


////////////////////////////////////////////////
//CARGAR GIF TRANSPARENTE (LEO)

void TTFEspera::CargarImagen(TImage *imagen,String nombreFichero)
{
    // Formatos: BMP, GIF, JPG, ICO, EMF, WMF

    HRESULT hr = S_OK;
    const int HIMETRIC_INCH   = 2540;
    IPicture *pPicture = NULL;

    hr =:: OleLoadPicturePath( StringToOleStr(nombreFichero),
       NULL, 0, 0, IID_IPicture, (void**)&pPicture);

    if(FAILED(hr))
           {
            AnsiString pathApp = ExtractFilePath(Application->ExeName);
            nombreFichero      = pathApp+"Img\\xxxxxx.gif";
            OleLoadPicturePath( StringToOleStr(nombreFichero),
            NULL, 0, 0, IID_IPicture, (void**)&pPicture);
           }


    // Carga la imagen en el TImage
    if (pPicture)
    {
        imagen->Picture = NULL;
        long ancho, alto;
        pPicture->get_Width(&ancho);
        pPicture->get_Height(&alto);
        imagen->Picture->Bitmap->Width = MulDiv(ancho,
        GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSX),   
        HIMETRIC_INCH);
        imagen->Picture->Bitmap->Height = MulDiv(alto,
        GetDeviceCaps(imagen->Canvas->Handle, LOGPIXELSY),
        HIMETRIC_INCH);
        RECT rect = imagen->ClientRect;
        pPicture->Render(imagen->Canvas->Handle, 0, 0,
        imagen->Picture->Bitmap->Width, imagen->Picture->Bitmap->Height,
        0, alto, ancho, -alto, &rect);
        pPicture->Release();

        //Centro Imagen
        imagen->Left = 0;
        imagen->Top  = 0;
    }


/////////////////////////////////
//rOTAMOS IMAGEN GIF (LEO)

void TTFEspera::RotarImagen(TImage* imagen, bool haciaDerecha)
{
    std::auto_ptr<Graphics> bmpDest(new Graphics::TBitmap);
    Graphics::TBitmap* bmpOrig = imagen->Picture->Bitmap;
    bmpOrig->PixelFormat = pf24bit;
    bmpDest->PixelFormat = pf24bit;
    bmpDest->Width = bmpOrig->Height;
    bmpDest->Height = bmpOrig->Width;

    for (int y = 0; y <bmpOrig>Height; y++)
    {
        RGBTRIPLE* ptrOrig = static_cast<RGBTRIPLE>(bmpOrig->ScanLine
        [y]);
        for (int x = 0; x <bmpOrig>Width; x++)
        {
            RGBTRIPLE* pixelOrig = ptrOrig + x;

            RGBTRIPLE* ptrDest;
            RGBTRIPLE* pixelDest;

            if (haciaDerecha)
            {
                ptrDest = static_cast<RGBTRIPLE>(bmpDest->ScanLine[x]);
                pixelDest = ptrDest - y + bmpOrig->Height - 1;
            }
            else
            {
                ptrDest = static_cast<RGBTRIPLE>(
                bmpDest->ScanLine[bmpOrig->Width-x-1]);
                pixelDest = ptrDest + y;
            }

            *pixelDest = *pixelOrig;
        }
    }

    imagen->Picture->Bitmap->Assign(bmpDest.get());

    bmpDest->SaveToFile("RelojTemp.gif");

    delete bmpOrig; bmpOrig = NULL;

    Application->ProcessMessages();

}


La primera vez que realiza la accion en el bucle actua correctamente paso a paso incluso graba la nueva imagen gif (rotada)...
El problema surge al liberar el TImage para volver a realizar las operaciones (salta el error)...

Alguna idea...Si no es mucho perdir me gustaria rotar la imagen en vez de 90 en 90 grados, en otro intervalo (45º-45º,25º-25º...) es posible
GRACIAS
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Sólo una pregunta: La penúltima línea (delete bmpOrig; bmpOrig = NULL; ) ¿no te da error? Tal como la tienes al hacer el final (bmpOrig = NULL;) debería decirte que la variable no existe.
_________________
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

Hola..

No me da error, es mas siempre que que elimino un puntero lo hago de esta manera, de hecho el no hacerlo asi me ha dado problemas en algunas ocasiones.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Existen componentes para visualizar imágenes y animaciones Gif. Hace unos años yo mismo escribí una que llamé TGifViewer y que ouedes encontrar aquí. Posiblemente reuna las características que pretendes. Está escrito con Builder 5 y delphi 7.

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

Muchisimas gracias escafandra , los probare.
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.