Nascondere i menu di Vista Aero con MFC 9.0

 C Programming >> Programmazione C >  >> Tags >> MFC
Nascondere i menu di Vista Aero con MFC 9.0

Probabilmente hai notato che IE7 o Windows Media Player 11 non hanno il menu mostrato per impostazione predefinita; viene visualizzato solo quando si preme il tasto ALT. Questa è una particolarità dell'aspetto grafico di Windows Vista Aero. Puoi trovare le linee guida sulla progettazione dei menu qui:

  • linee guida per i menu
  • concetti di progettazione del menu

Come rivelato dal team di VC++ qualche tempo fa, MFC 9.0 offre il supporto per nascondere i menu automaticamente e manualmente, in conformità con l'aspetto grafico di Aero. Un recente articolo su MSDN Magazine di Tarek Madkour, spiega come:chiamando il metodo SetMenuBarVisibility da CFrameWnd con AFX_MBV_DISPLAYONFOCUS . Quello che non viene detto è che funziona solo per le applicazioni SDI.

Menu nelle applicazioni SDI

In un'applicazione SDI hai una classe derivata da CFrameWnd , solitamente chiamato CMainFrame . In OnCreate() metodo, dopo aver chiamato CFrameWnd::OnCreate , puoi chiamare SetMenuBarVisibility :

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
      return -1; 

   SetMenuBarVisibility(AFX_MBV_DISPLAYONFOCUS); 

   // other stuff here 

   return 0; 
}

AFX_MBV_DISPLAYONFOCUS è definito in afxwin.h:

// Frame window menu bar visibility styles 
#define AFX_MBV_KEEPVISIBLE    0x01L // always visible 
#define AFX_MBV_DISPLAYONFOCUS 0x02L // toggle state on ALT 
#define AFX_MBV_DISPLAYONF10   0x04L // display on F10

Il risultato è che il menu viene automaticamente nascosto (come si può vedere nell'immagine)

 

e visualizzato solo premendo il tasto ALT.

Menu nelle applicazioni MDI

La stessa tecnica non funziona per i menu MDI. In una tale applicazione hai

  • un frame principale, rappresentato da una classe (di solito chiamata) CMainFrame derivata da CMDIFrameWnd, che a sua volta è derivata da CFrameWnd, e
  • uno o più frame figli, derivati ​​da CMDIChildFrame, che a sua volta è derivato da CFrameWnd

Sia la finestra principale che le finestre secondarie possono avere menu, ma il menu di una finestra figlia è mostrato sulla stessa barra con il menu della finestra principale. Finché esiste una finestra figlio, viene mostrato il menu di quel documento. Quando non esiste alcuna finestra figlio, viene visualizzato il menu della finestra principale. Entrambi sulla stessa barra.

Cercare di nascondere per impostazione predefinita il menu delle finestre figlie non funziona. Chiamando SetMenuBarVisibility non ha effetto:

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
   if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
      return -1;

   SetMenuBarVisibility(AFX_MBV_DISPLAYONFOCUS);

   return 0;
}

Chiamando SetMenuBarVisibility per il frame principale si verifica un errore di asserzione perché l'implementazione in CMDIFrameWnd si aspetta che il parametro sia sempre AFX_MBV_KEEPALIVE; non fa nient'altro, come chiamare la funzione dalla classe base.

void CMDIFrameWnd::SetMenuBarVisibility(DWORD dwStyle)
{
   ENSURE_ARG(dwStyle == AFX_MBV_KEEPVISIBLE);
   ASSERT(m_dwMenuBarVisibility == AFX_MBV_KEEPVISIBLE);
}

Sovrascrivere il metodo in CMainFrame accetta qualsiasi parametro e chiama il metodo in CFrameWnd per bypassare CMDIFrameWnd non ha alcun effetto.

void CMainFrame::SetMenuBarVisibility(DWORD dwStyle)
{
   CFrameWnd::SetMenuBarVisibility(dwStyle);
}

In conclusione MFC 9.0 supporta il look-and-feel Aero per nascondere automaticamente i menu, ma solo nelle applicazioni SDI.