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 

Problemas con código para skin (Piel/caratula)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problemas con código para skin (Piel/caratula) Responder citando

He utilizado el código que muy amablemente _Leo nos ha proporcionado y es una maravilla, el problema es que estoy creando una aplicación en C++ builder 4 y con el código del skin para builder 1.0, este código lo pase a una unidad nueva, y en la forma principal incluyo la unidad y llamo la función desde el inicio de la forma; funciona pero luego de compliar o utilizar varias veces del programa aparece el siguiente mensaje de error:

PREDIN provocó un error de protección general
en el módulo DIBENG.DLL de 0003:00000fa9.
Registros:
EAX=000019d4 CS=03a7 EIP=00000fa9 EFLGS=00000202
EBX=000005b4 SS=2e07 ESP=00007790 EBP=000077ae
ECX=000002d8 DS=3366 ESI=000c46a0 FS=33cf
EDX=00000000 ES=20a7 EDI=003f6044 GS=209f
Bytes en CS:EIP:
,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x ,02x
Volcado de pila:
,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x ,08x

PREDIN es el nombre de la aplicación. Si no utilizo la función en el programa, este funciona correctamente, quiciera saber que es lo que sucede, y si _Leo, te queda un poco de tiempo dame una mano en este lio.
_________________
ssv
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Utiliza preferiblemente la primera rutina que aparece, la segunda fue solo para que funcionase en BCB1. La primera la utilizo bastante y nunca me ha dado problemas.

De todos modos si prefieres seguir usando la segunda rutina (para BCB1) te aviso de que tiene un error. El error esta al usar auto_ptr para crear un array, ya que auto_ptr al liberar la memoria usa siempre delete y no delete[]. Aquí tienes una versión corregida:
Código:
void BitmapToRgn(TForm *form, TImage *img)
{
    form->BorderStyle = bsNone;

    Graphics::TBitmap *bmp =
        dynamic_cast< Graphics::TBitmap* >( img->Picture->Bitmap );

    form->SetBounds( form->Left, form->Top, bmp->Width, bmp->Height );
    img->SetBounds( 0, 0, bmp->Width, bmp->Height );
    form->Brush->Bitmap = bmp;

    int tamanyoImagen = bmp->Width * bmp->Height * 4;
    std::auto_ptr< BITMAPINFO > lpbmi( new BITMAPINFO );
    std::auto_ptr< TMemoryStream > bits( new TMemoryStream );
    bits->SetSize(tamanyoImagen);
    ZeroMemory(lpbmi.get(), sizeof(BITMAPINFOHEADER));
    lpbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmi->bmiHeader.biWidth = bmp->Width;
    lpbmi->bmiHeader.biHeight = bmp->Height;
    lpbmi->bmiHeader.biPlanes = 1;
    lpbmi->bmiHeader.biBitCount = 32;
    lpbmi->bmiHeader.biCompression = BI_RGB;
    lpbmi->bmiHeader.biSizeImage = tamanyoImagen;
    GetDIBits(bmp->Canvas->Handle, bmp->Handle, 0, bmp->Height,
        bits->Memory, lpbmi.get(), DIB_RGB_COLORS);
    DWORD colorTransparente = reinterpret_cast<DWORD*>
        (bits->Memory)[bmp->Width * (bmp->Height-1)];

    HRGN rgn = CreateRectRgn( 0, 0, form->Width, form->Height );
    HRGN rgnTemp = CreateRectRgn( 0, 0, form->Width, form->Height );
    CombineRgn( rgn, rgn, rgnTemp, RGN_DIFF );
    DeleteObject( rgnTemp );
    for (int y=0; y < bmp->Height; ++y)
    {
        DWORD* pixel = &reinterpret_cast<DWORD*>
            (bits->Memory)[bmp->Width * (bmp->Height - 1 - y)];
        int ancho = 0;

        for (int x=0; x <= bmp->Width; ++x)
        {
            if ( x != bmp->Width && pixel[x] != colorTransparente )
                ancho++;
            else
                if ( ancho > 0 )
                {
                    rgnTemp = CreateRectRgn( x - ancho, y, x, y + 1 );
                    CombineRgn( rgn, rgn, rgnTemp, RGN_OR );
                    DeleteObject( rgnTemp );
                    ancho = 0;
                }
        }
    }
    SetWindowRgn( form->Handle, rgn, true );
    DeleteObject( rgn );
}

De todos modos si aun así te sigue dando problemas y si tu proyecto no es privado pásame una copia al email que aparece abajo y los pasos para reproducir el problema e intentare ayudarte en lo que pueda.

leosoft ARROBA telefonica PUNTO net
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Posible causa del error Responder citando

Muchas gracias _Leo por la respuesta a mi inquietud, la implemente y hasta el momento ha funcionado. Ademas de modificar la función con el nuevo código lo que hice fue cargar la imagen para la forma del skin cuando el programa está corriendo de esa manera dejo en limpio el componente image; como estoy manejando un archivo de inicio donde almaceno la ruta de los directorios del programa, garantizo que puedo cambiar el estilo de la forma con solo modificar dicho archivo de inicio.

En cuanto a una copia del programa, cuando termine se la envio; si tengo otra inquietud no dudare en hacerla pública en este foro. De antemano muchas gracias a todos los colaboradores de este club ya que han resuelto muchos de mis problemas.
_________________
ssv
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.