Wie soll ich das BILD (unabhängig vom Typ) der Schaltfläche in der Symbolleiste in MFC-Anwendungen ändern?

Nov 29 2020

Ich weiß, dass dies ein dummes Problem ist, aber ich bin seit 4 Tagen damit beschäftigt. Warum ist es so kompliziert, nur die Symbolleiste in den MFC-Apps zu ändern?

Ich erstelle eine neue Visual Studio MFC-Anwendung , die dialogbasiert ist . Ich erstelle eine neue Symbolleistenressource . Und wie soll ich dann Bilder (PNG, Bitmap, JPEG ...) oder einen anderen Typ festlegen, der in meiner Symbolleiste verwendet werden soll?

Ich habe die Größe auf w50 und h50 eingestellt und kann innerhalb der Knöpfe zeichnen. Aber ich kann keinen Weg finden, Bild zu verwenden.

Stattdessen möchte ich diese 2 Schaltflächen, die ich gerade ausprobiert habe, wenn sie funktionieren, 8 Bilder im Bitmap-Format und in PNG verwenden. Ich habe irgendwo gelesen, dass PNG von MFC-Anwendungen nicht unterstützt wird, also habe ich auf Bitmap konvertiert.

Ich lade meine Symbolleiste in der Dialog-App wie folgt in der OnInitDialog()Methode:

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

Bitte, wenn mir jemand helfen kann, wäre ich sehr dankbar. Das Bildformat spielt keine Rolle. Ich möchte nur ein Bild in die Symbolleiste einfügen.

Dies ist derzeit meine App:

UPDATE: Ich habe es so versucht. ID_BUTTON_1Wenn die erste Schaltfläche in der Symbolleiste und ich versucht haben, das Bild zu ändern. Damit befindet sich jedoch keine Schaltfläche in der Symbolleiste an der Stelle für die erste Schaltfläche. Was mache ich falsch?

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

Antworten

3 AndrewTruckle Nov 29 2020 at 19:00

Ich habe dies kürzlich beantwortet und kann meine Antwort nicht mehr finden. Sie können PNG-Bilder für Ihre Symbolleisten verwenden. Unter der Haube verwenden Sie weiterhin die BMP-Version für den Ressourceneditor, um Ihre Ereignishandler usw. zu erstellen. Sie können dann jedoch Ihr PNG als Ressource hinzufügen und es dann in Ihren Dialog laden.

Zum Beispiel nenne ich das in meiner OnInitDialogFunktion:

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

    }
}

Ich weiß nicht, wohin meine vorherige Antwort gegangen ist, sonst hätte ich dies als Duplikat markiert. #verwirrt.