MFCアプリケーションのツールバーのボタンのIMAGE(タイプは関係ありません)をどのように変更する必要がありますか?

Nov 29 2020

私はこれが愚かな問題であることを知っていますが、私は過去4日間それで立ち往生しています。MFCアプリのツールバーを変更するだけで複雑なのはなぜですか?

私は、新しいVisual Studioの作成MFCアプリケーションダイアログベースを。新しいツールバーリソースを作成します。次に、ツールバーで使用する画像(png、ビットマップ、jpeg ...)またはその他のタイプをどのように設定する必要がありますか?

サイズをw50とh50に設定し、ボタンの内側に描画できます。しかし、私は画像を使用する方法を見つけることができません。

代わりに、私が試したばかりのこの2つのボタンが機能する場合は、ビットマップ形式とpngの8つの画像を使用します。PNGがMFCアプリケーションでサポートされていないことをどこかで読んだので、ビットマップに変換しました。

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

    }
}

以前の回答がどこに行ったのかわかりません。そうでなければ、これに重複のフラグを付けていたでしょう。#confused。