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 

Form transparente

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Form transparente Responder citando

Este código hace transparentes las zonas del Form sin controles.

En el evento OnCreate del Form ponemos:

  HRGN frmRgn = CreateRectRgn(0, 0, Width,
                    Height-ClientHeight-GetSystemMetrics(SM_CYSIZEFRAME));

  for (int i=0; i<ControlCount; i++)
  {
      TRect R = Controls[i]->BoundsRect;
      OffsetRect((RECT*)&R, ClientOrigin.x - Left, ClientOrigin.y - Top);
      HRGN tmpRgn = CreateRectRgnIndirect((RECT*)&R);
      CombineRgn(frmRgn, frmRgn, tmpRgn, RGN_OR);
      DeleteObject(tmpRgn);
  }

  SetWindowRgn(Handle, frmRgn, true);
  DeleteObject(frmRgn);


---
PD: probado en BCB1 y BCB5

Volver arriba
Mensaje    Asunto: Responder citando

El código anterior funciona en cualquier versión de Windows.

Y otra forma de hacerlo si usamos cualquier versión de C++Builder en Windows 2000 o XP, pero con la ventaja de que podemos indicarle que color queremos que sea transparente:

Código:
void __fastcall FormColorTransparente(TForm *form, TColor color)
{
    typedef BOOL (WINAPI *PSetLayeredWindowAttributes)
        (HWND, COLORREF, BYTE, DWORD);

    HMODULE hDll = GetModuleHandle("user32.dll");
    if (hDll)
    {
        PSetLayeredWindowAttributes pSetLayeredWindowAttributes =
            reinterpret_cast<PSetLayeredWindowAttributes>(
                GetProcAddress(hDll, "SetLayeredWindowAttributes") );

        if (pSetLayeredWindowAttributes)
        {
            SetWindowLong(form->Handle, GWL_EXSTYLE,
                GetWindowLong(form->Handle, GWL_EXSTYLE)
                | 0x80000 /*WS_EX_LAYERED*/);

            pSetLayeredWindowAttributes(form->Handle,
                ColorToRGB(color), 0, 1 /*LWA_COLORKEY*/);
        }
    }
}

Un ejemplo de su uso. Añadimos las líneas siguientes al constructor del Form:

    // Cambia el color de fondo del Form
    Color = clFuchsia;
    // Y hace que ese color sea transparente
    FormColorTransparente( this, clFuchsia );


En BCB6 no es necesario usar esta función ya que el Form tiene propiedades para hacerlo directamente, aunque funciona igualmente.

Dejar claro que esta función solo funciona en Windows 2000 y XP ya que solo estos tienen esta función en su API.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Excelente Mr. Green y si le pones a la opción "BorderStyle" de la forma "bsNone", efecto completo, gracias por el tip.

Rolling Eyes

WinMan
Volver arriba
Mensaje    Asunto: Responder citando

Versión mejorada del primer método usando regiones. La ventaja de este nuevo es que además de aplicaciones SDI también funciona en MDI:

Código:
int altoCaption = GetSystemMetrics(SM_CYCAPTION);
int anchoBorde  = GetSystemMetrics(SM_CXSIZEFRAME);
int altoBorde   = GetSystemMetrics(SM_CYSIZEFRAME);

HRGN frmRgn = CreateRectRgn(0, 0, Width, altoCaption + altoBorde);

for (int i = 0; i < ControlCount; i++)
{
    RECT R = Controls[i]->BoundsRect;
    OffsetRect(&R, anchoBorde, altoBorde + altoCaption);
    HRGN tmpRgn = CreateRectRgnIndirect(&R);
    CombineRgn(frmRgn, frmRgn, tmpRgn, RGN_OR);
    DeleteObject(tmpRgn);
}

SetWindowRgn(Handle, frmRgn, true);
DeleteObject(frmRgn);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: No desaparece la zona caption Responder citando

He estado provando el ultimo ejemplo y la zona de caption de la ventana no me desaparece. Mi aplicación corre sobre W2000 , aunque correrà sobre XP. Y uso BCB 5. Y es una ventana MDIChild.

Que hago mal?

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

funciona perfecto, gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Funciona bien, pero no genera eventos de ratón ni de teclado.
¿Podría hacerse un form invisible pero que sea sensible al ratón y al teclado?

Saludos.
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.