Error de control de la cinta? (causa corte en vista)
-
08-07-2019 - |
Pregunta
Descubrí que cuando tomo una forma simple que contiene solo una barra de cinta y una barra de estado, se corta. El control que ve encima de la barra de estado se eliminó más tarde. Se produce el mismo corte independientemente del control que esté presente. Más tarde eliminé la barra de estado & amp; coloque un control memo allí en su lugar con el mismo resultado.
sin barra de cinta:
(fuente: xrw.bc.ca )
con barra de cinta:
(fuente: xrw.bc.ca )
He ilustrado esto con algunos dibujos a 2, 4 y 8 píxeles desde el borde.
(fuente: xrw.bc.ca )
(fuente: xrw.bc.ca )
como Chris Lively dice a continuación, claramente ha habido un error de cálculo de los tamaños. ¿Cómo puedo corregir esto?
¡Gracias por sus comentarios!
Solución
No entendí el problema con mi respuesta anterior.
Hay una solución a este problema de error de cálculo que he podido encontrar (rápidamente).
Puede usar un manejador de mensajes personalizado para WM_SYSCOMMAND con el parámetro SC_MAXIMIZE wParam. Luego puede cambiar el tamaño de su formulario usando lo siguiente:
type
TForm1 = class(TForm)
// other stuff
procedure WMSyscommand(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
procedure TForm1.WMSysCommand(var Msg: TWMSYSCOMMAND);
var
R: TRect;
begin
// Test for SC_MAXIMIZE. If found...
if Msg.CmdType = SC_MAXIMIZE then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Top := R.Top;
Left := R.Left;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
Msg.Result := 0; // Message handled
end
else
DefaultHandler(Msg);
end;
El código anterior (probado en Vista Premium Home de 32 bits con Aero / Glass habilitado) funciona bien.
Otros consejos
La solución propuesta por Ken White tiene algunos problemas:
- El botón Maximizar permanece activo, puede usar controladores de cambio de tamaño en la ventana maximizada
- No se puede restaurar la ventana al tamaño anterior.
Entonces propongo lo siguiente:
// add to form object
procedure WMGetMinMaxInfo(var mmInfo : TWMGETMINMAXINFO); message WM_GETMINMAXINFO;
// implementation
procedure TfrmMain.WMGetMinMaxInfo(var mmInfo: TWMGETMINMAXINFO);
var
R: TRect;
begin
with mmInfo.MinMaxInfo^ do
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
ptMaxPosition.X := R.Left;
ptMaxPosition.Y := R.Top;
ptMaxSize.X := R.Right - R.Left;
ptMaxSize.Y := R.Bottom - R.Top-1;
end;
end;
No es ideal, ya que tengo que (por alguna razón) ajustar maxHeight en -1 para que el controlador predeterminado no se reafirme y mueva la ventana a -8, -8, ... Pero funciona para mí.