Como devo alterar a IMAGEM (não importa o tipo) do botão na barra de ferramentas em aplicativos MFC?

Nov 29 2020

Eu sei que este é um problema estúpido, mas estou preso a ele nos últimos 4 dias. Por que é tão complicado apenas modificar a barra de ferramentas nos aplicativos MFC?

Eu crio um novo aplicativo MFC Visual studio que é baseado em diálogo . Eu crio um novo recurso da barra de ferramentas . E então como devo definir as imagens (png, bitmap, jpeg ...) ou qualquer tipo a ser usado na minha barra de ferramentas?

Eu configurei o tamanho para w50 e h50 e posso desenhar dentro dos botões. Mas não consigo encontrar uma maneira de usar a imagem.

Ao invés destes 2 botões que acabei de experimentar estão funcionando, quero usar 8 imagens que estão em formato bitmap e em png. Eu li em algum lugar que PNG não é compatível com aplicativos MFC, então eu converti em bitmap.

Eu carrego minha barra de ferramentas no aplicativo de diálogo assim no OnInitDialog()método:

    DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
    DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;
    CMFCToolBar::m_dblLargeImageRatio = 1;

    if (m_ToolBar.CreateEx(this, dwCtrlStyle, dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR1))
    {
        dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC;
        m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle);
        CMFCToolBarInfo info;
        m_ToolBar.LoadToolBarEx(IDR_TOOLBAR1, info, FALSE);
        CSize   sizeToolBar = m_ToolBar.CalcFixedLayout(TRUE, TRUE);
        m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy, SWP_NOACTIVATE | 
        SWP_NOZORDER);
        CPoint ptOffset(0, sizeToolBar.cy);
    }

Por favor, se alguém puder me ajudar ficaria muito grato. O formato da imagem não importa. Eu só quero colocar a imagem na barra de ferramentas.

Este é meu aplicativo atualmente:

ATUALIZAÇÃO: eu tentei dessa forma. ID_BUTTON_1se o primeiro botão na barra de ferramentas e eu tentei mudar sua imagem. Mas com isso não há botão na barra de ferramentas no local do primeiro botão. O que estou fazendo errado?

VERIFY(m_toolbar.LoadBitmap(IDB_BITMAP1));
CMFCToolBarButton mbutton;
mbutton.SetImage(m_toolbar.GetImages()->GetCount() - 1);
m_toolbar.ReplaceButton(ID_BUTTON_1, CMFCToolBarButton(ID_BUTTON_1, 0));

Respostas

3 AndrewTruckle Nov 29 2020 at 19:00

Respondi recentemente e não consigo mais encontrar minha resposta. Você pode usar imagens PNG para suas barras de ferramentas. Nos bastidores, você ainda usa a versão BMP para o editor de recursos para criar seus manipuladores de eventos etc. Mas você pode adicionar seu PNG como um recurso e carregá-lo em sua caixa de diálogo.

Por exemplo, eu chamo isso em minha OnInitDialogfunção:

void CMeetingScheduleAssistantDlg::CreateToolbar()
{
    DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
    DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;

    CMFCToolBar::m_dblLargeImageRatio = 1; // AJT v20.1.7 Bug fix
    if (m_ToolBar.CreateEx(this, dwCtrlStyle,
        dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR))
    {
        dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC;
        m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle);

        CMFCToolBarInfo info;

        info.m_uiColdResID = IDB_PNG_MAIN_TOOLBAR;
        info.m_uiHotResID = IDB_PNG_MAIN_TOOLBAR;
        info.m_uiLargeColdResID = IDB_PNG_MAIN_TOOLBAR;
        info.m_uiLargeHotResID = IDB_PNG_MAIN_TOOLBAR;

        m_ToolBar.LoadToolBarEx(IDR_TOOLBAR, info, FALSE);

        CSize   sizeToolBar = m_ToolBar.CalcFixedLayout(TRUE, TRUE);
        m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy,
            SWP_NOACTIVATE | SWP_NOZORDER);

        // Move all controls down
        CPoint ptOffset(0, sizeToolBar.cy);

        CRect  rcChild;
        CWnd* pwndChild = GetWindow(GW_CHILD);
        while (pwndChild)
        {
            if (pwndChild->GetSafeHwnd() != m_ToolBar.GetSafeHwnd())
            {
                pwndChild->GetWindowRect(rcChild);
                ScreenToClient(rcChild);
                rcChild.OffsetRect(ptOffset);
                pwndChild->MoveWindow(rcChild, FALSE);
            }
            pwndChild = pwndChild->GetNextWindow();
        }

        // Resize the window
        CRect rcWindow;
        GetWindowRect(rcWindow);
        rcWindow.bottom += sizeToolBar.cy;
        MoveWindow(rcWindow, FALSE);

    }
}

Não sei para onde foi minha resposta anterior, caso contrário, teria sinalizado como duplicado. #confuso.