2011-01-31 7 views
5

De forma predeterminada, un formulario que tiene BorderStyle = bsizeable tiene un menú de sistema (a la izquierda) y un botón de cierre ('X' a la derecha). Quiero deshacerme del menú del sistema y mantener el botón de cerrar.Formulario Delphi sin menú de sistema pero con botón de cierre

La propiedad BorderIcons me permite eliminar el menú del sistema (a través de biSystemmenu), pero ahora el botón de cerrar también se ha ido.

¿Hay alguna manera de hacerlo?

Utilizando Delphi XE

PD: debe ser posible en lo que se refiere a Windows: ventana "configuración de filtrado InPrivate" de IE8 es importante, tiene un botón de cierre y no tiene menú del sistema.

+6

extraño, para mí el valor predeterminado para 'EstiloDeLosBordes = bsDialog' qué no ** ** tienen un menú de sistema, independientemente de lo que es especificado en 'BorderIcons'. 'biSystemMenu' necesita estar ahí para mostrar la X roja. –

+0

Tienes razón, bsDialog funciona del modo que yo quiero. Blush ;-) He actualizado la pregunta: también quiero que funcione para bsSizeable. – Giel

+0

Windows Media Center –

Respuesta

0

No creo que haya una manera de hacerlo sin recurrir al dibujo personalizado de su área no cliente, que es muy difícil cuando se trata de vidrio.

Considere este método.

procedure TMyForm.DeleteSystemMenu; 
var 
    SystemMenu: HMenu; 
begin 
    SystemMenu := GetSystemMenu(Handle, False); 
    DeleteMenu(SystemMenu, SC_CLOSE, MF_BYCOMMAND); 
end; 

Si tiene éxito en la eliminación del material de antemano Cerrar en el menú del sistema, sino que también se traduce en el botón de cierre está deshabilitado. Entonces parece que no puedes tener uno sin el otro.

+2

Eso parece hacer lo * opuesto * de lo que se solicita. Obviamente mantiene el menú del sistema (ya que lo está modificando), pero desactiva el botón. –

+0

Lo mismo para 'DeleteMenu (SystemMenu, SC_SIZE, MF_BYCOMMAND);' Elimina el elemento de menú Tamaño y como consecuencia no puede cambiar el tamaño del formulario. –

+0

@Rob Lee mi respuesta nuevamente. El punto que estoy planteando es que si eliminas partes del menú del sistema, la función de coincidencia en la barra de subtítulos también se desactivará. De hecho, tu comentario al Q parece estar haciendo un punto similar. –

0

BorderStyle := bsSizeToolWin hace lo que quiere, con una apariencia ligeramente diferente del botón X.

+0

-1. Esto es demasiado diferente, y esta diferencia no deseada no es necesaria. –

0

Por "menú del sistema" ¿quiere decir icono a la izquierda de la barra de título? ¿O menú emergente invocado a través de clic derecho?

Si es icono que desea eliminar - utilizar este código:

const 
    WM_ResetIcon = WM_APP - 1; 

type 
    TForm1 = class(TForm) 
    procedure FormShow(Sender: TObject); 
    protected 
    procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon; 
    end; 

implementation 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    PostMessage(Handle, WM_ResetIcon, 0, 0); 
end; 

procedure TForm1.WMResetIcon(var Message: TMessage); 
const 
    ICON_SMALL = 0; 
    ICON_BIG = 1; 
begin 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0)); 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0)); 
end; 
Cuestiones relacionadas