La rimozione dell'icona del titolo di Windows bar senza ammaraggio pulsante di chiusura o sistema di menu?

StackOverflow https://stackoverflow.com/questions/10059

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top