¿Cómo debo cambiar la IMAGEN (no importa el tipo) del botón en la barra de herramientas en las aplicaciones MFC?

Nov 29 2020

Sé que este es un problema estúpido, pero me he quedado atascado durante los últimos 4 días. ¿Por qué es tan complicado simplemente modificar la barra de herramientas en las aplicaciones MFC?

Creo Nueva Visual Studio aplicación MFC que se basa diálogo . Creo un nuevo recurso de la barra Google . Y luego, ¿cómo debo configurar las imágenes (png, mapa de bits, jpeg ...) o cualquier tipo para usar en mi barra de herramientas?

He configurado el tamaño en w50 y h50 y puedo dibujar dentro de los botones. Pero no puedo encontrar la manera de usar la imagen.

En su lugar, estos 2 botones que acabo de probar si funcionan, quiero usar 8 imágenes que están en formato de mapa de bits y en png. Leí en alguna parte que PNG no es compatible con las aplicaciones MFC, así que lo convertí a mapa de bits.

Carga mi barra de herramientas en la aplicación de diálogo así en el 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, si alguien me puede ayudar, estaría muy agradecido. El formato de la imagen no importa. Solo quiero poner una imagen en la barra de herramientas.

Esta es mi aplicación actualmente:

ACTUALIZACIÓN: Lo he intentado de esta manera. ID_BUTTON_1si el primer botón en la barra de herramientas y traté de cambiar su imagen. Pero con esto no hay ningún botón en la barra de herramientas en el lugar del primer botón. ¿Que estoy haciendo mal?

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));

Respuestas

3 AndrewTruckle Nov 29 2020 at 19:00

Respondí esto recientemente y ya no puedo encontrar mi respuesta. Puede utilizar imágenes PNG para sus barras de herramientas. Bajo el capó, todavía usa la versión BMP para el editor de recursos para crear sus controladores de eventos, etc. Pero luego puede agregar su PNG como un recurso y luego cargarlo en su diálogo.

Por ejemplo, llamo a esto en mi OnInitDialogfunción:

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);

    }
}

No sé a dónde ha ido mi respuesta anterior, de lo contrario, lo habría marcado como duplicado. #confuso.