He estado ausente un tiempo. Me he encontrado este hilo y la referencia en
este otro.
Veo que posiblemente a estas alturas el problema está solucionado, pero me gustaría aportar mi granito de arena al problema.
Hasta Windows 8 no es posible tener el estilo
WS_EX_LAYERED en ventanas child por lo que el problema no tiene solución... O si, la solución es hacer
"trampas" y simular que una ventana top-level es child.
http://msdn.microsoft.com/es-es/libr...=vs.85%29.aspx
Cita:
|
Empezado por MSD
Windows 8: The WS_EX_LAYERED style is supported for top-level windows and child windows. Previous Windows versions support WS_EX_LAYERED only for top-level windows.
|
Mi propuesta es simple. Se trata de escribir la función de tratamiento de mensajes para WM_MOVING en el formulario padre y en los hijos:
Código Delphi
[-]procedure WMMoving(var Message: TWMMOVING); message WM_MOVING;
Para el formulario Padre tratamos de que las ventanas hijas se desplacen con él para que parezcan childwindows:
Código Delphi
[-]
procedure TForm1.WMMoving(var Message: TWMMOVING);
var
i: integer;
begin
inherited;
for i:= 0 to ComponentCount-1 do
begin
if Components[i].ClassName <> 'TForm2' then continue;
with Components[i] as TForm do
SetWindowPos(Handle, HWND_TOPMOST, Message.DragRect.Left + Left - self.Left,
Message.DragRect.Top + Top - self.Top,
0, 0, SWP_NOSIZE);
end;
end;
Y para el formulario hijo evitamos que pueda salir del entorno de la ventana padre, simulando ser child:
Código Delphi
[-]
procedure TForm2.WMMoving(var Message: TWMMOVING);
var
Right, Bottom: integer;
begin
inherited;
with Application.MainForm do
begin
Right:= Left + Width;
Bottom:= Top + Height;
if Message.DragRect.Left < Left then
begin
Message.DragRect.Left:= Left;
Message.DragRect.Right:= Left + self.Width;
end;
if Message.DragRect.Top < Top then
begin
Message.DragRect.Top:= Top;
Message.DragRect.Bottom:= Top + self.Height;
end;
if Message.DragRect.Left > Right - self.Width then
begin
Message.DragRect.Left:= Right - self.Width;
Message.DragRect.Right:= Right - self.Width + self.Width;
end;
if Message.DragRect.Bottom > Bottom then
begin
Message.DragRect.Top:= Bottom - self.Height;
Message.DragRect.Bottom:= Bottom - self.Height + self.Height;
end;
end;
end;
El resto del código que presento es adorno. Subo un ejemplo compilable en delphi7.
Espero haber servido de ayuda aunque sea un poco tarde.
Saludos.