Pergunta

Existem três locais onde os menus aparecem na nova funcionalidade MFC (Feature Pack):

  • Nas barras de menu (CMFCMenuBar)
  • Em menus pop-up (CMFCPopupMenu)
  • Na versão do 'menu suspenso' do CMFCButton

Quero colocar ícones (coloridos e com transparência) nos menus de todos eles.Encontrei CFrameWndEx::OnDrawMenuImage() que posso usar para desenhar de forma personalizada os ícones na frente dos itens da barra de menu.Não é muito conveniente ter que implementar o desenho de ícones em 2008, mas funciona.Para os outros ainda não encontrei solução.Existe uma maneira automática de definir ícones para menus?

Foi útil?

Solução

Foi assim que fiz funcionar:

Primeiro

, como os outros disseram, crie uma barra de ferramentas invisível próxima à sua barra de ferramentas principal (estou usando os nomes usuais baseados nos nomes do 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:As imagens e os recursos da barra de ferramentas

IDR_MAINFRAME e IDR_MAINFRAME_256 foram gerados pelo AppWizard.A primeira é a versão feia de 16 cores e a última é a versão interessante de cores altas.
Apesar do nome, se bem me lembro, até a imagem gerada pelo AppWizard tem profundidade de cor de 24 bits.O legal:Basta substituí-lo por uma imagem de 32 bits e isso também funcionará.

Existe a barra de ferramentas invisível IDR_OTHERTOOLBAR:Criei uma barra de ferramentas com o editor de recursos.Apenas alguns ícones fictícios e os IDs de comando.O VS então gerou um bitmap que substituí pela minha versão em cores altas.Feito!

Observação

Não abra as barras de ferramentas com o editor de recursos:Pode ser necessário convertê-lo para 4 bits antes de poder fazer qualquer coisa com ele.E até mesmo se você deixou fazer isso (porque, pelas costas do Visual Studio, você substituiria o resultado pela imagem colorida novamente, ha!), descobri que (às vezes?) simplesmente não é possível editar a barra de ferramentas.Muito estranho.
Nesse caso aconselho editar diretamente o arquivo .rc.

Outras dicas

Acredito (mas posso estar errado) que essas classes são iguais às classes BCGToolbar que foram incluídas no MFC quando a Microsoft comprou o BCG.Nesse caso, você pode criar uma barra de ferramentas e usar o mesmo ID em um botão da barra de ferramentas dos itens de menu para os quais deseja criar ícones, e eles devem aparecer automaticamente.Claro, você não precisa realmente exibir as barras de ferramentas.

No BCGToolbar, basta criar uma barra de ferramentas nos recursos e carregá-la (mas não exibir a janela), mas o botão da barra de ferramentas deve ter o mesmo ID do item de menu ao qual deseja vinculá-lo.

Tente usar esta função:

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

Então, por exemplo:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

Funcionou muito bem para mim.

Uma coisa que pode pegar uma pessoa de surpresa é que para barras de ferramentas personalizáveis ​​(ou seja, não bloqueadas), a primeira barra de ferramentas que você cria, a estrutura se divide e se transforma em uma espécie de bitmap de paleta de todos os ícones do programa.Se você tentar adicionar mais barras de ferramentas posteriormente (ou barras de ferramentas diferentes) que possuem bitmaps (ou pngs) com uma profundidade de cor diferente da primeira, elas parecerão falhar porque não é possível adicioná-las à mesma paleta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top