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: sin barra de cinta
(fuente: xrw.bc.ca )

con barra de cinta: con barra de cinta
(fuente: xrw.bc.ca )

He ilustrado esto con algunos dibujos a 2, 4 y 8 píxeles desde el borde.

 no maximizado
(fuente: xrw.bc.ca )
maximizado
(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!

¿Fue útil?

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.

 Imagen del extremo izquierdo de la cinta

 Imagen del extremo derecho de la cinta

 Imagen de la barra de estado

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top