2011-01-31 20 views
5

Per impostazione predefinita, un modulo con BorderStyle = bsSizeable ha un menu di sistema (a sinistra) e un pulsante di chiusura ("X", a destra). Voglio sbarazzarmi del menu di sistema e mantenere il pulsante di chiusura.Modulo Delphi senza menu di sistema ma con pulsante Chiudi

La proprietà BorderIcons mi consente di rimuovere il menu di sistema (tramite biSystemmenu), ma ora anche il pulsante di chiusura è scomparso.

C'è un modo per farlo?

Utilizzando Delphi XE

PS: dovrebbe essere possibile per quanto concerne Finestre: finestra "Impostazioni InPrivate Filtering" di IE8 è piuttosto grande, ha un pulsante di chiusura e non ha menu di sistema.

+6

Strano, per me il valore predefinito per 'BorderStyle = bsDialog' non ** ** hanno un menu di sistema indipendentemente da ciò che è specificato in 'BorderIcons'. 'biSystemMenu' deve essere lì per mostrare la X rossa. –

+0

Hai ragione, bsDialog funziona come voglio io. Arrossire ;-) Ho aggiornato la domanda: voglio che funzioni anche per bsSizeable. – Giel

+0

Windows Media Center –

risposta

0

Non penso che ci sia un modo per farlo senza ricorrere al disegno personalizzato dell'area non-client, che è molto difficile quando il vetro è coinvolto.

Considerare questo metodo.

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

Si riesce a liberarsi della stretta voce dal menu di sistema, ma si traduce anche nel pulsante di chiusura viene disattivato. Quindi sembrerebbe che non puoi averne uno senza l'altro.

+2

Sembra fare il * contrario * di quanto richiesto. Ovviamente mantiene il menu di sistema (dal momento che lo stai modificando), ma disabilita il pulsante. –

+0

La stessa cosa per 'DeleteMenu (SystemMenu, SC_SIZE, MF_BYCOMMAND);' Rimuove la voce del menu Dimensione e di conseguenza non è possibile ridimensionare il modulo. –

+0

@Rob Leggi di nuovo la mia risposta. Il punto che sto facendo è che se si eliminano parti del menu di sistema, anche la funzionalità di corrispondenza sulla barra dei sottotitoli viene disabilitata. In realtà, il commento alla Q sembra fare un punto simile. –

0

BorderStyle := bsSizeToolWin fa quello che vuoi, con un aspetto leggermente diverso del pulsante X.

+0

-1. Questo è troppo diverso, e questa differenza indesiderata non è necessaria. –

0

Per "menu di sistema" si intende l'icona a sinistra della barra del titolo? O menu popup richiamato tramite clic destro?

Se è l'icona che si desidera rimuovere - di questo codice:

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; 
Problemi correlati