MFC 응용 프로그램의 도구 모음에있는 단추의 IMAGE (유형은 중요하지 않음)를 어떻게 변경해야합니까?

Nov 29 2020

나는 이것이 어리석은 문제라는 것을 알고 있지만 지난 4 일 동안 붙어 있습니다. MFC 앱에서 툴바를 수정하는 것이 왜 그렇게 복잡한가요?

대화 기반의 New Visual Studio MFC 응용 프로그램 을 만듭니다 . 새로운 툴바 리소스를 생성 합니다 . 그런 다음 이미지 (png, 비트 맵, jpeg ...) 또는 도구 모음에서 사용할 유형을 어떻게 설정해야합니까?

크기를 w50과 h50으로 설정했고 버튼 내부에 그릴 수 있습니다. 그러나 이미지를 사용하는 방법을 찾을 수 없습니다.

대신 내가 방금 시도한이 2 개의 버튼이 작동한다면 비트 맵 형식과 png로 된 8 개의 이미지를 사용하고 싶습니다. MFC 응용 프로그램에서 PNG가 지원되지 않는다는 것을 읽었으므로 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);

    }
}

이전 답변이 어디로 갔는지 모르겠습니다. 그렇지 않으면 이것을 중복으로 표시했을 것입니다. # 혼란.