Domanda

Sono tre le posizioni in cui vengono visualizzati i menu nella nuova funzionalità MFC (Feature Pack):

  • Nelle barre dei menu (CMFCMenuBar)
  • Nei menu a comparsa (CMFCPopupMenu)
  • Nella versione "menu a discesa" di CMFCButton

Voglio inserire le icone (a colori elevati e con trasparenza) nei menu di tutti.Ho trovato CFrameWndEx::OnDrawMenuImage() che posso utilizzare per disegnare in modo personalizzato le icone davanti agli elementi della barra dei menu.Non è molto conveniente, dovendo implementare il disegno delle icone nel 2008, ma funziona.Per gli altri non ho ancora trovato una soluzione.Esiste un modo automatico per impostare le icone per i menu?

È stato utile?

Soluzione

Ecco come l'ho fatto funzionare:

Primo

, come hanno detto gli altri, crea una barra degli strumenti invisibile accanto alla barra degli strumenti principale (sto usando i soliti nomi basati sui nomi di AppWizard):

MainFrm.h:
class CMainFrame
{
    //...    
    CMFCToolBar m_wndToolBar;
    CMFCToolBar m_wndInvisibleToolBar;
    //...
};

MainFrm.cpp:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    //...

    // Normal, visible toolbar
    if(m_wndToolBar.Create(this,
        TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
    {
        VERIFY( m_wndToolBar.LoadToolBar(
            theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME) );

        // Only the docking makes the toolbar visible
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        DockPane(&m_wndToolBar);
    }

    // Invisible toolbar; simply calling Create(this) seems to be enough
    if(m_wndInvisibleToolBar.Create(this))
    {
        // Just load, no docking and stuff
        VERIFY( m_wndInvisibleToolBar.LoadToolBar(IDR_OTHERTOOLBAR) );
    }
}

Secondo:Le immagini e le risorse della barra degli strumenti

IDR_MAINFRAME E IDR_MAINFRAME_256 sono stati generati da AppWizard.La prima è la brutta versione a 16 colori e la seconda è l'interessante versione a colori intensi.
Nonostante il nome, se ricordo bene, anche l'immagine generata dall'AppWizard ha una profondità di colore di 24 bit.La cosa bella:Basta sostituirlo con un'immagine a 32 bit e funzionerà anche questo.

C'è la barra degli strumenti invisibile IDR_OTHERTOOLBAR:Ho creato una barra degli strumenti con l'editor di risorse.Solo alcune icone fittizie e gli ID dei comandi.VS ha quindi generato una bitmap che ho sostituito con la mia versione a colori elevati.Fatto!

Nota

Non aprire le barre degli strumenti con l'editor di risorse:Potrebbe essere necessario convertirlo a 4 bit prima di poter fare qualsiasi cosa con esso.E persino Se lo lasci fare (perché, alle spalle di Visual Studio, sostituirai di nuovo il risultato con l'immagine a colori elevati, ah!), ho scoperto che (a volte?) semplicemente non può modificare la barra degli strumenti.Molto strano.
In tal caso consiglio di modificare direttamente il file .rc.

Altri suggerimenti

Credo (ma potrei sbagliarmi) che queste classi siano le stesse delle classi BCGToolbar incluse in MFC quando Microsoft acquistò BCG.In tal caso, puoi creare una barra degli strumenti e utilizzare su un pulsante della barra degli strumenti lo stesso ID delle voci di menu per cui desideri creare icone e queste dovrebbero apparire automaticamente.Naturalmente non è necessario visualizzare effettivamente le barre degli strumenti.

In BCGToolbar è sufficiente creare una barra degli strumenti nelle risorse e caricarla (ma non visualizzare la finestra), ma il pulsante della barra degli strumenti deve avere lo stesso ID della voce di menu a cui vuoi collegarlo.

Prova ad usare questa funzione:

CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
   UINT uiBmpResID=0,
   UINT uiColdResID=0,
   UINT uiMenuResID=0,
   UINT uiDisabledResID=0,
   UINT uiMenuDisabledResID=0);

Quindi ad esempio:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

Ha funzionato molto bene per me.

Una cosa che può cogliere di sorpresa è che per le barre degli strumenti personalizzabili (cioè non bloccate), la prima barra degli strumenti che crei, la struttura si divide e si trasforma in una sorta di bitmap della tavolozza di tutte le icone nel programma.Se provi ad aggiungere più barre degli strumenti in un secondo momento (o barre degli strumenti diverse) che hanno bitmap (o png) con una profondità di colore diversa dalla prima, sembra che falliscano perché non è possibile aggiungerle alla stessa tavolozza.

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