Ver Mensaje Individual
  #44  
Antiguo 05-04-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 06-04-2013 a las 20:19:27.
Responder Con Cita