• Martes 12 de Noviembre de 2024, 21:03

Autor Tema:  Como Crear Ventana Especial  (Leído 3378 veces)

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
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 :hola:
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
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
    • Ver Perfil
    • http://AyudaCBuilder.foros.st
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
  1.  
  2. #include <memory>
  3.  
  4. /// Da al form la forma del bitmap dado, usando como color
  5. //    transparente el de la esquina inferior izquierda
  6. void BitmapToRgn(TForm *form, TImage *img)
  7. {
  8.     form->BorderStyle = bsNone;
  9.  
  10.     Graphics::TBitmap *bmp =
  11.         dynamic_cast< Graphics::TBitmap* >( img->Picture->Bitmap );
  12.  
  13.     form->SetBounds( form->Left, form->Top, bmp->Width, bmp->Height );
  14.     img->SetBounds( 0, 0, bmp->Width, bmp->Height );
  15.     form->Brush->Bitmap = bmp;
  16.  
  17.     int tamanyoImagen = bmp->Width * bmp->Height * 4;
  18.     std::auto_ptr< BITMAPINFO > lpbmi( new BITMAPINFO );
  19.     std::auto_ptr< BYTE > bits( new BYTE[tamanyoImagen] );
  20.  
  21.     ZeroMemory( lpbmi.get(), sizeof(BITMAPINFO) );
  22.     lpbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  23.     lpbmi->bmiHeader.biWidth = bmp->Width;
  24.     lpbmi->bmiHeader.biHeight = bmp->Height;
  25.     lpbmi->bmiHeader.biPlanes = 1;
  26.     lpbmi->bmiHeader.biBitCount = 32;
  27.     lpbmi->bmiHeader.biCompression = BI_RGB;
  28.     lpbmi->bmiHeader.biSizeImage = tamanyoImagen;
  29.  
  30.     GetDIBits( bmp->Canvas->Handle, bmp->Handle, 0, bmp->Height,
  31.         bits.get(), lpbmi.get(), DIB_RGB_COLORS );
  32.  
  33.     DWORD colorTransparente = reinterpret_cast<DWORD*>
  34.         ( bits.get() )[ bmp->Width * (bmp->Height-1) ];
  35.  
  36.     HRGN rgn = CreateRectRgn( 0, 0, form->Width, form->Height );
  37.     HRGN rgnTemp = CreateRectRgn( 0, 0, form->Width, form->Height );
  38.     CombineRgn( rgn, rgn, rgnTemp, RGN_DIFF );
  39.     DeleteObject( rgnTemp );
  40.     for (int y=0; y < bmp->Height; ++y)
  41.     {
  42.         DWORD *pixel = &reinterpret_cast<DWORD*>
  43.             ( bits.get() )[ bmp->Width * (bmp->Height - 1 - y) ];
  44.         int ancho = 0;
  45.  
  46.         for (int x=0; x <= bmp->Width; ++x)
  47.         {
  48.             if ( x != bmp->Width && pixel[x] != colorTransparente )
  49.                 ancho++;
  50.             else
  51.                 if ( ancho > 0 )
  52.                 {
  53.                     rgnTemp = CreateRectRgn( x - ancho, y, x, y + 1 );
  54.                     CombineRgn( rgn, rgn, rgnTemp, RGN_OR );
  55.                     DeleteObject( rgnTemp );
  56.                     ancho = 0;
  57.                 }
  58.         }
  59.     }
  60.     SetWindowRgn( form->Handle, rgn, true );
  61.     DeleteObject( rgn );
  62. }
  63. //---------------------------------------------------------------------------
  64.  
  65. __fastcall TForm1::TForm1(TComponent* Owner)
  66.     : TForm(Owner)
  67. {
  68.     BitmapToRgn( this, Image1 );
  69. }
  70. //---------------------------------------------------------------------------
  71.  
  72. void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button,
  73.     TShiftState Shift, int X, int Y)
  74. {
  75.   //Para poder mover el formulario haciendo click en cualquier lugar del mismo
  76.  
  77.     if ( mbLeft == Button )
  78.     {
  79.         ReleaseCapture();
  80.         Perform( WM_SYSCOMMAND, 0xF012, 0 );
  81.     }
  82. }
  83. //---------------------------------------------------------------------------
  84.  
  85. void __fastcall TForm1::Cerrar1Click(TObject *Sender)
  86. {
  87.     Close();
  88. }
  89. //---------------------------------------------------------------------------
  90. //_Leo
  91.  
  92.  

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: ar
    • Ver Perfil
    • http://www.einstec.com.ar
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 :hola:
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
    • Ver Perfil
    • http://AyudaCBuilder.foros.st
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
    • Ver Perfil
    • http://AyudaCBuilder.foros.st
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
    • Ver Perfil
    • http://AyudaCBuilder.foros.st
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: ar
    • Ver Perfil
    • http://www.einstec.com.ar
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!!! :hola:
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
    • Ver Perfil
    • http://AyudaCBuilder.foros.st
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
  1.  
  2.  
  3. //---------------------------------------------------------------------------------
  4. void BitmapToRgn(TForm *form, TImage *img)
  5. {
  6.     form->BorderStyle = bsNone;
  7.  
  8.     Graphics::TBitmap *bmp =
  9.         dynamic_cast< Graphics::TBitmap* >( img->Picture->Bitmap );
  10.  
  11.     form->SetBounds( form->Left, form->Top, bmp->Width, bmp->Height );
  12.     img->SetBounds( 0, 0, bmp->Width, bmp->Height );
  13.     form->Brush->Bitmap = bmp;
  14.  
  15.     int tamanyoImagen = bmp->Width * bmp->Height * 4;
  16.     std::auto_ptr< BITMAPINFO > lpbmi( new BITMAPINFO );
  17.     std::auto_ptr< BYTE > bits( new BYTE[tamanyoImagen] );
  18.  
  19.     ZeroMemory( lpbmi.get(), sizeof(BITMAPINFO) );
  20.     lpbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  21.     lpbmi->bmiHeader.biWidth = bmp->Width;
  22.     lpbmi->bmiHeader.biHeight = bmp->Height;
  23.     lpbmi->bmiHeader.biPlanes = 1;
  24.     lpbmi->bmiHeader.biBitCount = 32;
  25.     lpbmi->bmiHeader.biCompression = BI_RGB;
  26.     lpbmi->bmiHeader.biSizeImage = tamanyoImagen;
  27.  
  28.     GetDIBits( bmp->Canvas->Handle, bmp->Handle, 0, bmp->Height,
  29.         bits.get(), lpbmi.get(), DIB_RGB_COLORS );
  30.  
  31.     DWORD colorTransparente = reinterpret_cast<DWORD*>
  32.         ( bits.get() )[ bmp->Width * (bmp->Height-1) ];
  33.  
  34.     HRGN rgn = CreateRectRgn( 0, 0, form->Width, form->Height );
  35.     HRGN rgnTemp = CreateRectRgn( 0, 0, form->Width, form->Height );
  36.     CombineRgn( rgn, rgn, rgnTemp, RGN_DIFF );
  37.     DeleteObject( rgnTemp );
  38.     for (int y=0; y < bmp->Height; ++y)
  39.     {
  40.         DWORD *pixel = &reinterpret_cast<DWORD*>
  41.             ( bits.get() )[ bmp->Width * (bmp->Height - 1 - y) ];
  42.         int ancho = 0;
  43.  
  44.         for (int x=0; x <= bmp->Width; ++x)
  45.         {
  46.             if ( x != bmp->Width && pixel[x] != colorTransparente )
  47.                 ancho++;
  48.             else
  49.                 if ( ancho > 0 )
  50.                 {
  51.                     rgnTemp = CreateRectRgn( x - ancho, y, x, y + 1 );
  52.                     CombineRgn( rgn, rgn, rgnTemp, RGN_OR );
  53.                     DeleteObject( rgnTemp );
  54.                     ancho = 0;
  55.                 }
  56.         }
  57.     }
  58.     SetWindowRgn( form->Handle, rgn, true );
  59.     DeleteObject( rgn );
  60. }
  61. //---------------------------------------------------------------------------
  62.  
  63.  

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: ar
    • Ver Perfil
    • http://www.einstec.com.ar
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!!! :hola:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»