Ver Mensaje Individual
  #1  
Antiguo 14-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Reputación: 19
xEsk Va por buen camino
Mostar/Ocultar una sombra a un Form en tiempo de ejecución

Este truco es para mostrar u ocultar una sombra, en nuestros Forms en tiempo de ejecución. Es muy habitual encontrar un truco parecido, que consiste en crear el formulario con la Sombra ya puesta, pero pocas veces se explica como ponerla y quitarla en tiempo de ejecución, así que he decidido escribir este truco :)

Este truco sólo funciona en Windows XP.

Esta pequeña función nos servirá para saber si la aplicación esta siendo ejecutada en un WinXP:
Código Delphi [-]
function IsWinXP: Boolean;
begin
 Result:=(Win32Platform = VER_PLATFORM_WIN32_NT) and
         (Win32MajorVersion >= 5) and (Win32MinorVersion >= 1);
end;

En esta segunda función lo que obtenemos, es si el usuario activo de Windows, tiene activa la propiedad "Sombras" a los menús (tales como Inicio, PopupMenus, etc...). Esta función la necesitamos para luego restaurar la configuración inicial del usuario.
Código Delphi [-]
function isDropShadowEnabled: Boolean;
{$IFDEF VER150} // Si es la version 7 (o inferior) de Delphi, entonces declara esta constante
const
  SPI_GETDROPSHADOW = $1024;
{$ENDIF}
begin
  SystemParametersInfo(SPI_GETDROPSHADOW, 0, @Result, 0);
end;

Aquí viene el código principal del Truco, en donde por parámetros le pasaremos si queremos mostrar u ocultar (activar o desactivar) la sombra en nuestro Formulario.
Código Delphi [-]
procedure TForm1.doActivateDropShadow(Enabled: Boolean);
{$IFDEF VER150} // Si es la versión 7 (o inferior) de Delphi, entonces declara estas constantes
const
  SPI_SETDROPSHADOW = $1025;
  CS_DROPSHADOW     = $20000;
{$ENDIF}
var
  teniaSombra: Boolean; // Esta variable recordara si tenia o no activa la opción de las sombras

begin
  // Esta corriendo en un WinXP? Si no es asi, abandona.
  if not IsWinXP then Exit;
  // Antes de cambiar nada, guardamos el estado inicial (config. del usuario de windows)
  teniaSombra:=isDropShadowEnabled;
  // Queremos activar la Sombra?
  if Enabled then
    begin
      // Activa la Sombra
      SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0);
      SetClassLong(Handle,GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
    end
  else // Quita la Sombra
    SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(False), 0);
  // Recrea la ventana
  RecreateWnd;
  // Restaura la configuración inicial del usuario  
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(teniaSombra), 0);
end;

Como podéis observar, es quizás un poco "basto" la forma que tiene de quitar la sombra (su funcionamiento se basa en poner la propiedad de "Sombras" de Windows a FALSE, así pues ningún menú en nuestro Windows tendrá sombras, recrear la ventana y luego restauramos la propiedad "Sombras" al valor puesto por el usuario.

Espero que os sirva este truco.

P.D.: La propiedad "Sombras" de Windows que tanto nombro, se puede cambiar desde: "Propiedades de pantalla -> Apariencia -> Efectos... -> "Mostrar sombras bajo los menús"

Saludos.
Responder Con Cita