Sábado 14 de Diciembre de 2024, 14:38
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
»
C++ Builder
(Moderador:
Eternal Idol
) »
Como Crear Ventana Especial
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Como Crear Ventana Especial (Leído 3398 veces)
© Jonathan ©
Moderador
Mensajes: 1671
Nacionalidad:
Como Crear Ventana Especial
«
en:
Jueves 15 de Enero de 2004, 20:06 »
0
Hola, siempre tuve una duda, como crear una ventana en builder pero un tanto especial, aqui adjunto una imagen tomada de mi escritorio en la cual hay una ventana un tanto especial, como se podria hacer algo similar en builder. Gracias y saludos
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
Tweet
EINSTEC Tecnología
«La única fuente del conocimiento es la experiencia.»
«Lo importante es no dejar de hacerse preguntas.»
_Viktor
Miembro MUY activo
Mensajes: 271
Re: Como Crear Ventana Especial
«
Respuesta #1 en:
Viernes 16 de Enero de 2004, 04:31 »
0
Hola, esto te servira, consiste en algo asi como un skin, donde la imagen que pongas le dara la forma al formulario, es decir necesitas un TImage y un boton para simular el boton close de los formularios:
Código: Text
#include <memory>
/// Da al form la forma del bitmap dado, usando como color
// transparente el de la esquina inferior izquierda
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< BYTE > bits( new BYTE[tamanyoImagen] );
ZeroMemory( lpbmi.get(), sizeof(BITMAPINFO) );
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.get(), lpbmi.get(), DIB_RGB_COLORS );
DWORD colorTransparente = reinterpret_cast<DWORD*>
( bits.get() )[ 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.get() )[ 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 );
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
BitmapToRgn( this, Image1 );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
//Para poder mover el formulario haciendo click en cualquier lugar del mismo
if ( mbLeft == Button )
{
ReleaseCapture();
Perform( WM_SYSCOMMAND, 0xF012, 0 );
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Cerrar1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
//_Leo
Espero te sirva.-
Saludos!
_Viktor _Yañez_
"Ser inteligente no es ser mas, solo equivocarse menos y no usar visual basic"
http]
© Jonathan ©
Moderador
Mensajes: 1671
Nacionalidad:
Re: Como Crear Ventana Especial
«
Respuesta #2 en:
Sábado 17 de Enero de 2004, 21:57 »
0
Perdoname amigo, pero soy muuuuuuy principiante en esto de builder y no he logrado hacer funcionar lo que me has otorgado, podrias darme una mano?... como hago lo del TImage y el boton... Disculpas por las molestias ocacionadas y las gracias por tu ayuda
...Saludos
EINSTEC Tecnología
«La única fuente del conocimiento es la experiencia.»
«Lo importante es no dejar de hacerse preguntas.»
_Viktor
Miembro MUY activo
Mensajes: 271
Re: Como Crear Ventana Especial
«
Respuesta #3 en:
Domingo 18 de Enero de 2004, 13:44 »
0
Claro, dame tu correo y te envio un ejemplo funcionando... pero durante el dia, aca son las 9:00 de la mañana y vengo recien llegando a mi casa... asi que durante el dia me comprometo a enviertelo... oka?
Saludos!
_Viktor _Yañez_
"Ser inteligente no es ser mas, solo equivocarse menos y no usar visual basic"
http]
_Viktor
Miembro MUY activo
Mensajes: 271
Re: Como Crear Ventana Especial
«
Respuesta #4 en:
Lunes 19 de Enero de 2004, 19:42 »
0
Hola de nuevo, listo, aca te envio una imagen de como se ve y el ejemplo te lo envie a tu mail, esta compilado en C++ Builder 6, si tienes problemas con eso tengo la version 4 y 5, aunque tengo que hacerme un tiempo para instalarla...
Bueno eso... espero te sirva.
Saludos
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
_Viktor _Yañez_
"Ser inteligente no es ser mas, solo equivocarse menos y no usar visual basic"
http]
_Viktor
Miembro MUY activo
Mensajes: 271
Re: Como Crear Ventana Especial
«
Respuesta #5 en:
Lunes 19 de Enero de 2004, 19:48 »
0
Pensandolo bien publico el ejemplo aca tambien, para que quede a disposicion del resto de los usuarios del foro.
Saludos
El mensaje contiene
1 archivo adjunto
. Debes
ingresar
o
registrarte
para poder verlo y descargarlo.
_Viktor _Yañez_
"Ser inteligente no es ser mas, solo equivocarse menos y no usar visual basic"
http]
© Jonathan ©
Moderador
Mensajes: 1671
Nacionalidad:
Re: Como Crear Ventana Especial
«
Respuesta #6 en:
Lunes 19 de Enero de 2004, 20:42 »
0
Gracias _Viktor, muy amable de tu parte, probare el ejemplo, intentare realizarlo con builder 1, ya que no dispongo de builder 6, ahh, dime... donde podria conseguir yo el builder 6???... Gracias por todo y saludos!!!
EINSTEC Tecnología
«La única fuente del conocimiento es la experiencia.»
«Lo importante es no dejar de hacerse preguntas.»
_Viktor
Miembro MUY activo
Mensajes: 271
Re: Como Crear Ventana Especial
«
Respuesta #7 en:
Lunes 19 de Enero de 2004, 20:54 »
0
Aqui esta un version de la misma funcion BitmapToRgn que funciona en BCB1, espero te sirva.
Código: Text
//---------------------------------------------------------------------------------
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< BYTE > bits( new BYTE[tamanyoImagen] );
ZeroMemory( lpbmi.get(), sizeof(BITMAPINFO) );
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.get(), lpbmi.get(), DIB_RGB_COLORS );
DWORD colorTransparente = reinterpret_cast<DWORD*>
( bits.get() )[ 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.get() )[ 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 );
}
//---------------------------------------------------------------------------
Saludos! y no te preocupes, que si no nos ayudamos entre programadores , ¿quien no ayuda ?
Saludos!
_Viktor _Yañez_
"Ser inteligente no es ser mas, solo equivocarse menos y no usar visual basic"
http]
© Jonathan ©
Moderador
Mensajes: 1671
Nacionalidad:
Re: Como Crear Ventana Especial
«
Respuesta #8 en:
Lunes 19 de Enero de 2004, 21:05 »
0
Un millon de gracias!!!, ahora si puedo hacerlo con builder 1, jejeje, pense que me hiba a ser imposible, pero veo que no, _Viktor, te agradesco nuevamente toda la ayuda que me has brindado y para cualquier cosa que necesites, puedes contar conmigo. Saludos y mas gracias!!!
EINSTEC Tecnología
«La única fuente del conocimiento es la experiencia.»
«Lo importante es no dejar de hacerse preguntas.»
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
»
C++ Builder
(Moderador:
Eternal Idol
) »
Como Crear Ventana Especial