Jak zmienić OBRAZ (nie ma znaczenia typ) przycisku na pasku narzędzi w aplikacjach MFC?

Nov 29 2020

Wiem, że to głupi problem, ale utknąłem z tym przez ostatnie 4 dni. Dlaczego modyfikacja paska narzędzi w aplikacjach MFC jest tak skomplikowana?

Tworzę nową Visual Studio aplikacji MFC , który jest oparty dialogowe . Tworzę nowy zasób paska narzędzi . A potem, jak ustawić obrazy (png, bitmapa, jpeg ...) lub jakikolwiek inny typ, który ma być używany na pasku narzędzi?

Ustawiłem rozmiar na w50 i h50 i mogę rysować wewnątrz przycisków. Ale nie mogę znaleźć sposobu na użycie obrazu.

Zamiast tego 2 przyciski, które właśnie wypróbowałem, jeśli działają, chcę użyć 8 obrazów w formacie bitmapy i png. Czytałem gdzieś, że PNG nie jest obsługiwany przez aplikacje MFC, więc przekonwertowałem na Bitmapę.

Ładuję mój pasek narzędzi w aplikacji dialogowej, tak jak w OnInitDialog()metodzie:

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

Byłbym bardzo wdzięczny, gdyby ktoś mógł mi pomóc. Format obrazu nie ma znaczenia. Chcę tylko umieścić obraz na pasku narzędzi.

To jest obecnie moja aplikacja:

UPDATE: próbowałem w ten sposób. ID_BUTTON_1jeśli pierwszy przycisk na pasku narzędzi i próbowałem zmienić jego obraz. Ale dzięki temu nie ma przycisku na pasku narzędzi w miejscu pierwszego przycisku. Co robię źle?

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

Odpowiedzi

3 AndrewTruckle Nov 29 2020 at 19:00

Odpowiedziałem na to niedawno i nie mogę już znaleźć odpowiedzi. Możesz używać obrazów PNG jako pasków narzędzi. Pod maską nadal używasz wersji BMP dla edytora zasobów do tworzenia programów obsługi zdarzeń itp. Możesz jednak dodać plik PNG jako zasób, a następnie załadować go do swojego okna dialogowego.

Na przykład nazywam to w mojej OnInitDialogfunkcji:

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

    }
}

Nie wiem, dokąd poszła moja poprzednia odpowiedź, w przeciwnym razie oznaczyłbym to jako duplikat. #zmieszany.