Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como quitar el "CS_DROPSHADOW" de una ventana? (https://www.clubdelphi.com/foros/showthread.php?t=30021)

xEsk 07-02-2006 10:57:37

Como quitar la sombra de una ventana?
 
Buenos dias,
Tengo un pequeño o gran problema (segun se mire), y es que se poner en tiempo real una sombra de esas "chulas" del WinXP en mi Form, pero no se quitarla en tiempo real!
(Mas info > http://www.swissdelphicenter.ch/de/showcode.php?id=1296)

Aqui os pongo el codigo que uso para poner la sombra al Form en "RealTime":

Código Delphi [-]
// Poner sombra 
procedure TMainForm.btnSombraClick(Sender: TObject); 
const 
  CS_DROPSHADOW = $00020000; 
begin 
  SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW); 
  RecreateWnd; 
end;

La verdad esq he probado ya varias formas para quitarla una vez puesta, pero nada... aqui mis intentos fracasados:

Código Delphi [-]
 
  SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE)); 
  RecreateWnd; 

  SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) - DROPSHADOW); 
  RecreateWnd; 

  SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or not DROPSHADOW); 
  RecreateWnd; 

  SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) and not DROPSHADOW); 
  RecreateWnd; 

  SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) and DROPSHADOW); 
  RecreateWnd;

xEsk 07-02-2006 15:02:55

Ui, un poco mas cerca de la solucion
 
Parece que ya lo he logrado, creo que es algo chapuza, pero hace lo que yo quiero... asi que ya me vale, hasta que no vea lo contrario xDDD

Aqui mi Chapu-Codigo (Demostracion de funcionamiento):

Código Delphi [-]
  ...
  // Activa la sombra por si estaba desactivada
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0);
  SetClassLong(Handle,GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
  RecreateWnd;

  // Actualitza el form y espera 1 segundito (para observar q hay sombra)
  Refresh;
  sleep(1000);

  // Desactiva la sombra (del windows entero)
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(False), 0);
  RecreateWnd;  // Recrea la ventana

  // Actualiza el form y espera 1 segundito para observar que ya no hay sombra
  Refresh;
  sleep(1000);
  // Activa la sombra a todo el windos otra vez
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0);
  ...

Ahora solo queda mejorarlo, para que no active las sombras de todo el windows en caso de que el usuario las tuviera desactivadas, pero eso ya es mas facil paritiendo de la base que tengo ahora.

Saludos.

xEsk 07-02-2006 15:57:34

Version mejorada
 
Aqui pongo el codigo final que he dejado en mi programa (comentarios traducidos al español), y funciona bastante bien hasta el momento:

Código Delphi [-]
... 
var 
  DropShadowEnabled: Boolean; // flag para activar/desactivar la sombra 
... 

// Devuelve si el programa corre bajo winxp 
function IsWinXP: Boolean; 
begin 
 Result:=(Win32Platform = VER_PLATFORM_WIN32_NT) and 
         (Win32MajorVersion >= 5) and (Win32MinorVersion >= 1); 
end; 

// Devuelve si el usuario tiene activada la sombra de los menus 
function isDropShadowEnabled: Boolean; 
begin 
  SystemParametersInfo(SPI_GETDROPSHADOW, 0, @Result, 0); 
end; 

// Activa o desactiva la sombra de la ventana 
procedure TMainForm.doActivateDropShadow; 
var 
  teniaSombra: Boolean; 
begin 
  // Config. inicial del usuario 
  teniaSombra:=isDropShadowEnabled; 
  // Hay q poner sombra? 
  if DropShadowEnabled 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 sombra 
    SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(False), 0); 
  // Recrea la ventana 
  RecreateWnd; 
  // Restaura la configuracion de l'usuario 
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(teniaSombra), 0); 
end;

Saludos.


La franja horaria es GMT +2. Ahora son las 07:58:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi