SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: © Jonathan © en Jueves 15 de Enero de 2004, 20:06

Título: Como Crear Ventana Especial
Publicado por: © Jonathan © en Jueves 15 de Enero de 2004, 20:06
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:
Título: Re: Como Crear Ventana Especial
Publicado por: _Viktor en Viernes 16 de Enero de 2004, 04:31
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!
Título: Re: Como Crear Ventana Especial
Publicado por: © Jonathan © en Sábado 17 de Enero de 2004, 21:57
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:
Título: Re: Como Crear Ventana Especial
Publicado por: _Viktor en Domingo 18 de Enero de 2004, 13:44
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!
Título: Re: Como Crear Ventana Especial
Publicado por: _Viktor en Lunes 19 de Enero de 2004, 19:42
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
Título: Re: Como Crear Ventana Especial
Publicado por: _Viktor en Lunes 19 de Enero de 2004, 19:48
Pensandolo bien publico el ejemplo aca tambien, para que quede a disposicion del resto de los usuarios del foro.

Saludos ;)
Título: Re: Como Crear Ventana Especial
Publicado por: © Jonathan © en Lunes 19 de Enero de 2004, 20:42
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:
Título: Re: Como Crear Ventana Especial
Publicado por: _Viktor en Lunes 19 de Enero de 2004, 20:54
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!
Título: Re: Como Crear Ventana Especial
Publicado por: © Jonathan © en Lunes 19 de Enero de 2004, 21:05
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: