Question

Il existe trois endroits où les menus apparaissent dans la nouvelle fonctionnalité MFC (Feature Pack):

  • Dans les barres de menus (CMFCMenuBar)
  • Dans les menus contextuels (CMFCPopupMenu)
  • Dans la version 'menu déroulant' de CMFCButton

Je souhaite insérer des icônes (couleurs vives et transparentes) dans tous les menus. J'ai trouvé CFrameWndEx :: OnDrawMenuImage () que je peux utiliser pour personnaliser le dessin des icônes devant les éléments de la barre de menus. Ce n'est pas très pratique de devoir implémenter le dessin d'icônes en 2008, mais cela fonctionne. Pour les autres, je n'ai pas encore trouvé de solution. Existe-t-il un moyen automatique de définir des icônes pour les menus?

Était-ce utile?

La solution

Voici comment je l'ai fait fonctionner:

premier

, comme les autres l'ont dit, créez une barre d'outils invisible à côté de votre barre d'outils principale (j'utilise les noms habituels basés sur les noms d'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) );
    }
}

Deuxièmement: les images et les ressources de la barre d’outils

IDR_MAINFRAME et IDR_MAINFRAME_256 ont été générés par AppWizard. Le premier est la version 16 couleurs laide et le dernier est la version intéressante en couleurs vives.
Malgré son nom, si je me souviens bien, même l'image générée par AppWizard a une profondeur de couleur de 24 bits. La bonne chose: remplacez-la simplement par une image 32 bits et cela fonctionnera aussi.

Il y a la barre d'outils invisible IDR_OTHERTOOLBAR : j'ai créé une barre d'outils avec l'éditeur de ressources. Juste quelques icônes factices et les ID de commande. VS a ensuite généré un bitmap que j'ai remplacé par ma version en couleurs vives. Fait!

Remarque

N'ouvrez pas les barres d'outils avec l'éditeur de ressources: vous devrez peut-être le convertir en 4 bits avant de pouvoir faire quoi que ce soit avec. Et même si vous le laissez faire (parce que, derrière le dos de Visual Studio, vous allez à nouveau remplacer le résultat par une image couleur haute, ah!), J’ai trouvé que ça (parfois?) ne peut tout simplement pas éditer la barre d’outils. Très étrange.
Dans ce cas, je vous conseille de modifier directement le fichier .rc.

Autres conseils

Je pense (mais je me trompe peut-être) que ces classes sont les mêmes que les classes BCGToolbar incluses dans MFC lorsque Microsoft a acheté BCG. Si tel est le cas, vous pouvez créer une barre d’outils avec et utiliser le même identifiant sur un bouton de la barre d’outils que dans les éléments de menu pour lesquels vous souhaitez créer des icônes. Elles doivent apparaître automatiquement. Bien sûr, vous n’aurez pas à afficher les barres d’outils.

Dans BCGToolbar, il suffit de créer une barre d’outils dans les ressources & amp; chargez-le (sans afficher la fenêtre), mais le bouton de la barre d'outils doit avoir le même identifiant que l'élément de menu auquel vous souhaitez le lier.

Essayez d’utiliser cette fonction:

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

Donc, par exemple:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

a très bien fonctionné pour moi.

Une chose qui peut surprendre une personne est que, pour les barres d’outils personnalisables (c’est-à-dire non verrouillées), la première barre que vous créez, le cadre se scinde et se transforme en une sorte de palette bitmap de toutes les icônes du programme. Si vous essayez d'ajouter plus tard des barres d'outils (ou des barres d'outils différentes) comportant des bitmaps (ou pngs) avec une profondeur de couleur différente de celle de la première, elles semblent échouer car elles ne peuvent pas être ajoutées à la même palette.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top