Pregunta

Hay tres lugares donde aparecen los menús en la nueva funcionalidad MFC (Paquete de características):

  • En barras de menú (CMFCMenuBar)
  • En menús emergentes (CMFCPopupMenu)
  • En la versión 'menú desplegable' de CMFCButton

Quiero poner iconos (de colores intensos y con transparencia) en los menús de todos ellos.Encontré CFrameWndEx::OnDrawMenuImage() que puedo usar para dibujar de forma personalizada los íconos frente a los elementos de la barra de menú.No es muy conveniente tener que implementar el dibujo de iconos en 2008, pero funciona.Para los demás todavía no he encontrado una solución.¿Existe una forma automática de configurar íconos para menús?

¿Fue útil?

Solución

Así es como lo hice funcionar:

Primero

, como dijeron los demás, crea una barra de herramientas invisible al lado de tu barra de herramientas principal (estoy usando los nombres habituales basados ​​en los nombres de 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) );
    }
}

Segundo:Las imágenes y los recursos de la barra de herramientas.

IDR_MAINFRAME y IDR_MAINFRAME_256 fueron generados por AppWizard.La primera es la fea versión de 16 colores y la segunda es la interesante versión de colores intensos.
A pesar de su nombre, si mal no recuerdo, incluso la imagen generada por AppWizard tiene una profundidad de color de 24 bits.Lo genial:Simplemente reemplácelo con una imagen de 32 bits y eso también funcionará.

Ahí está la barra de herramientas invisible. IDR_OTHERTOOLBAR:Creé una barra de herramientas con el editor de recursos.Sólo algunos iconos ficticios y los ID de comando.Luego, VS generó un mapa de bits que reemplacé con mi versión de alto color.¡Hecho!

Nota

No abras las barras de herramientas con el editor de recursos:Puede que tenga que convertirlo a 4 bits antes de poder hacer algo con él.e incluso si lo dejas hacer (porque, a espaldas de Visual Studio, vas a reemplazar el resultado con la imagen en color intenso nuevamente, ¡ja!), descubrí que (¿a veces?) simplemente no puede editar la barra de herramientas.Muy extraño.
En ese caso recomiendo editar directamente el archivo .rc.

Otros consejos

Creo (pero puedo estar equivocado) que estas clases son las mismas que las clases de BCGToolbar que se incluyeron en MFC cuando Microsoft compró BCG.Si es así, puede crear una barra de herramientas y usar la misma ID en un botón de la barra de herramientas que en los elementos del menú para los que desea crear iconos, y deberían aparecer automáticamente.Por supuesto, no es necesario que muestres las barras de herramientas.

En BCGToolbar, es suficiente crear una barra de herramientas en los recursos y cargarla (pero no mostrar la ventana), pero el botón de la barra de herramientas debe tener la misma ID que el elemento del menú al que desea vincularlo.

Intente usar esta función:

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

Entonces, por ejemplo:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

Funcionó muy bien para mí.

Una cosa que puede sorprender a una persona es que para las barras de herramientas personalizables (es decir, no bloqueadas), la primera barra de herramientas que crea, el marco se divide y se convierte en una especie de mapa de bits de paleta de todos los iconos del programa.Si intenta agregar más barras de herramientas más adelante (o barras de herramientas diferentes) que tengan mapas de bits (o png) con una profundidad de color diferente a la primera, parece que fallan porque no puede agregarlas a la misma paleta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top