Как мне изменить ИЗОБРАЖЕНИЕ (независимо от типа) кнопки на панели инструментов в приложениях MFC?

Nov 29 2020

Я знаю, что это глупая проблема, но я застрял в ней последние 4 дня. Почему так сложно просто изменить панель инструментов в приложениях MFC?

Я создаю новое приложение Visual Studio MFC , основанное на диалоге . Создаю новый ресурс Панели инструментов . И как мне затем установить изображения (png, растровые изображения, jpeg ...) или любой другой тип, который будет использоваться на моей панели инструментов?

Я установил размер w50 и h50 и могу рисовать внутри кнопок. Но я не могу найти способ использовать изображение.

Вместо этих двух кнопок, которые я только что попробовал, если они работают, я хочу использовать 8 изображений в растровом формате и в png. Я где-то читал, что PNG не поддерживается приложениями MFC, поэтому я преобразовал его в Bitmap.

Я загружаю свою панель инструментов в диалоговое приложение следующим образом в OnInitDialog()методе:

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

Пожалуйста, если кто-то может мне помочь, я был бы очень благодарен. Формат изображения не имеет значения. Я просто хочу поместить изображение на панель инструментов.

Сейчас это мое приложение:

ОБНОВЛЕНИЕ: я пробовал этот способ. ID_BUTTON_1если первая кнопка на панели инструментов, и я попытался изменить ее изображение. Но при этом на панели инструментов на месте первой кнопки нет кнопки. Что я делаю неправильно?

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

Ответы

3 AndrewTruckle Nov 29 2020 at 19:00

Я ответил на это недавно и больше не могу найти свой ответ. Вы можете использовать изображения PNG для панелей инструментов. Под капотом вы по-прежнему используете версию BMP для редактора ресурсов для создания обработчиков событий и т. Д. Но затем вы можете добавить свой PNG в качестве ресурса и затем загрузить его в свой диалог.

Например, я вызываю это в своей OnInitDialogфункции:

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

    }
}

Я не знаю, куда ушел мой предыдущий ответ, иначе я бы отметил это как дубликат. #смущенный.