La rimozione dell'icona del titolo di Windows bar senza ammaraggio pulsante di chiusura o sistema di menu?
-
08-06-2019 - |
Domanda
Sto sviluppando un'applicazione MFC e ho recentemente stato alla ricerca di un buon metodo per rimuovere l'icona dalla barra del titolo di Windows, ma che conservano il pulsante chiudi.I due ovvi soluzioni di spegnere il sistema di menu di stile o utilizzando la finestra dello strumento di stile, ma preferirei di no per disattivare il menu di sistema o utilizzare rattrappiti strumento barra del titolo della finestra.Molte applicazioni MFC disporre di questa funzionalità, quindi mi chiedo:mi manca qualche modo standard di fare questo?
Soluzione
È possibile utilizzare WM_NCRBUTTONDOWN
per rilevare se l'utente ha cliccato sul tuo didascalia e quindi visualizzare il menu di sistema.
Altri suggerimenti
Set WS_EX_DLGMODALFRAME
estesa stile.
Si potrebbe utilizzare una cucina completamente icona trasparente.
che dire di sbarazzarsi del menu di sistema e poi mettere di nuovo in un altro luogo yourseld (diciamo accanto al pulsante di chiusura, etc.)?
Senza l'icona, l'unico metodo che posso immaginare per gli utenti di accedere al sistema di menu è tramite clic destro della barra del titolo.
Se è quello che si aveva in mente, si potrebbero gestire WM_RBUTTONDOWN sul telaio principale e poi calcolare se la destra-clic sulla barra del titolo.
int clickX = GET_X_LPARAM(lParam);
int clickY = GET_Y_LPARAM(lParam);
CRect frameRect;
mainFrame.GetWindowRect(&frameRect);
int titleBarHeight = GetSystemMetrics(SM_CYCAPTION);
if (clickX >= frameRect.left &&
clickX <= frameRect.right &&
clickY >= frameRect.top &&
clickY <= frameRect.top + titleBarHeight)
{
TrackPopupMenu(m_systemMenu);
}
Un codice di esempio in Delphi che rimuove l'icona:
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;
Un simile codice dovrebbe funzionare per MFC.Fondamentalmente, è solo bisogno di WM_SETICON a NULL nel posto giusto.