PDA

Ver la Versión Completa : Como quitar el "CS_DROPSHADOW" de una ventana?


xEsk
07-02-2006, 10:57:37
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":

// 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:


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
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):


...
// 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
Aqui pongo el codigo final que he dejado en mi programa (comentarios traducidos al español), y funciona bastante bien hasta el momento:

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