Comment dois-je changer l'image (peu importe le type) du bouton dans la barre d'outils dans les applications MFC?

Nov 29 2020

Je sais que c'est un problème stupide mais je suis coincé avec ça depuis 4 jours. Pourquoi est-il si compliqué de simplement modifier la barre d'outils dans les applications MFC?

Je Créer un nouveau Visual Studio application MFC qui est basée dialogue . Je crée une nouvelle ressource Toolbar . Et puis comment définir les images (png, bitmap, jpeg ...) ou tout autre type à utiliser dans ma barre d'outils?

J'ai défini la taille sur w50 et h50 et je peux dessiner à l'intérieur des boutons. Mais je ne trouve pas moyen d'utiliser l'image.

Au lieu de ces 2 boutons que je viens d'essayer si cela fonctionne, je souhaite utiliser 8 images au format bitmap et au format png. J'ai lu quelque part que PNG n'est pas pris en charge par les applications MFC, j'ai donc converti en Bitmap.

Je charge ma barre d'outils dans l'application de dialogue comme ceci dans la OnInitDialog()méthode:

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

S'il vous plaît, si quelqu'un peut m'aider, je serais vraiment reconnaissant. Le format d'image n'a pas d'importance. Je veux juste mettre l'image dans la barre d'outils.

Ceci est mon application actuellement:

MISE À JOUR: j'ai essayé de cette façon. ID_BUTTON_1si le premier bouton de la barre d'outils et j'ai essayé de changer son image. Mais avec cela, il n'y a pas de bouton dans la barre d'outils à l'endroit du premier bouton. Qu'est ce que je fais 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));

Réponses

3 AndrewTruckle Nov 29 2020 at 19:00

J'y ai répondu récemment et je ne trouve plus ma réponse. Vous pouvez utiliser des images PNG pour vos barres d'outils. Sous le capot, vous utilisez toujours la version BMP pour l'éditeur de ressources pour créer vos gestionnaires d'événements, etc. Mais vous pouvez ensuite ajouter votre PNG en tant que ressource et le charger dans votre boîte de dialogue.

Par exemple, j'appelle ceci dans ma OnInitDialogfonction:

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

    }
}

Je ne sais pas où ma réponse précédente est allée, sinon j'aurais signalé cela comme un double. #confus.