delphi - teclas - multipantalla windows 10
¿Qué puedo hacer con las ventanas maximizadas y con estilo, que muestran sus bordes en monitores adyacentes? (2)
Después de jugar algo de tiempo en esto, mi opinión es que este no es un error de vcl-styles en absoluto. Esto de hecho está relacionado con el comportamiento en el blogs.msdn.com/b/oldnewthing/archive/2012/03/26/10287385.aspx mencionado en un comment a la pregunta por mghie .
El comportamiento específico es que, el tamaño de una ventana maximizada es mayor que el área de trabajo del monitor en el que se maximiza la ventana. Supuestamente, el administrador de ventanas oculta los bordes salientes. Aparentemente, no lo hace con marcos personalizados. Tenga en cuenta que el propio ejemplo de marco de ventana personalizado de MSDN parece sufrir el mismo problema (consulte la publicación titulada "Error cuando la ventana está maximizada" en el contenido de la comunidad). La aplicación de VCL es diferente al ejemplo de MSDN porque no está basado en DWM, pero sigo pensando que es el mismo problema.
Los bordes salientes tienen el tamaño del borde del tamaño del sistema (SM_C [X | Y] SIZEFRAME), pero esto es irrelevante para la solución a continuación, ya que ignora el tamaño / posición sugerido por el sistema operativo y utiliza el área de trabajo.
Lamentablemente, no creo que esta solución sea utilizable en absoluto. Por un lado, el comportamiento mencionado no está documentado, para dos, la solución no es perfecta; todavía hay un píxel extraño. Si ajusta la ventana exactamente en el área de trabajo, el administrador de ventanas decide desplazar la ventana hacia donde cree que debe ubicarse la ventana (con marcos ocultos). (El VCL probablemente podría modificarse para hacer lo que hace el administrador de ventanas, y tener en cuenta el sobresaliente y no dibujarlos o algo similar, pero sería más trabajo y aún así sería una solución para evitar el comportamiento no documentado ...)
De todas formas;
type
TForm1 = class(TForm)
..
protected
// overriding styles is not necessary since TFormStyleHook.WMGetMinMaxInfo
// first calls the default window procedure
procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
message WM_GETMINMAXINFO;
..
procedure TForm1.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo);
var
R: TRect;
begin
// always arrives with MinMaxInfo.ptMaxPosition = (-SM_CXFRAME, -SM_CYFRAME)
// and MinMaxInfo.ptMaxSize = (PrimaryMonitor.Width (?) + 2 * SM_CXFRAME, ... )
inherited;
// should test for OS, styles etc. before running the below
R := Monitor.WorkareaRect;
InflateRect(R, -1, -1); // odd pixel
OffsetRect(R, -Monitor.Left, -Monitor.Top);
Message.MinMaxInfo.ptMaxPosition := R.TopLeft;
Message.MinMaxInfo.ptMaxSize := Point(R.Width, R.Height);
end;
En un sistema de monitores múltiples, una aplicación VCL "en blanco" maximiza la multa, pero la misma aplicación con estilos habilitados (y uno elegido como predeterminado) maximiza incorrectamente. Lo que estoy viendo es que el borde derecho de la ventana se extiende al segundo monitor (mi principal está a la izquierda). Cuando comencé a comparar con otras aplicaciones de Windows, noté que en Windows 7 (al menos), las ventanas maximizadas ni siquiera tienen bordes que no sean del cliente en los lados izquierdo, derecho o inferior. Y, de hecho, la aplicación estándar VCL (sin estilo) se comporta de la misma manera, sin fronteras de clientes.
¿Cómo puedo solucionar esto? Noté que TFormStyleHook tiene un controlador para WMNCCalcSize, que aún no he analizado, pero me hace preguntarme si VCL podría estar manejando incorrectamente este mensaje para una ventana maximizada.
La única forma que encontré es manejar el evento WM_SIZE y modificar la región de la ventana para cortar el borde adicional.