Как показать весь CMFCToolBarComboBoxButton (не значок) в CMFCToolBar, закрепленный вертикально

У меня есть приложение MFC (с классом приложения, производным от CWinApp), и там есть класс панели инструментов, производный от CToolBar. Когда эта панель инструментов закреплена слева или справа, она по-прежнему показывает все встроенное в нее поле со списком (не значок).

введите здесь описание изображения

Такое поведение возможно благодаря следующему классу CMyToolBar:

class CMyToolBar : public CToolBar
{
public:
    CMyToolBar();

protected:
    afx_msg void OnPaint();
    afx_msg void OnMove(int x, int y);
    afx_msg LONG OnCheckUpdate(UINT uParam, LONG lParam);
    DECLARE_MESSAGE_MAP()
};

const int COMBOBOX_POS = 8;
const int COMBOBOX_WIDTH = 180;

BEGIN_MESSAGE_MAP(CMyToolBar, CToolBar)
    ON_WM_PAINT()
    ON_WM_MOVE()
    ON_MESSAGE(WM_USER + 3, OnCheckUpdate)
END_MESSAGE_MAP()

CMyToolBar::CMyToolBar() {}

void CMyToolBar::OnPaint()
{
    Default();

    CMainFrame* pMainFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());
    if (pMainFrame != NULL && ::IsWindow(pMainFrame->m_comboBox.m_hWnd))
    {
        PostMessage(WM_USER + 3, 0);
    }
}

LONG CMyToolBar::OnCheckUpdate(UINT uParam, LONG lParam)
{
    CMainFrame* pMainFrame = dynamic_cast<CMainFrame*>(AfxGetMainWnd());

    if (pMainFrame != NULL && ::IsWindow(pMainFrame->m_comboBox.m_hWnd))
    {
        CRect toolBarRect, comboBoxRect;
        GetClientRect(&toolBarRect);
        GetItemRect(COMBOBOX_POS, &comboBoxRect);

        bool bChanged = false;
        if (toolBarRect.Height() > comboBoxRect.Height() * 2)
        {
            if (comboBoxRect.Width() != COMBOBOX_WIDTH)
            {
                SetButtonInfo(COMBOBOX_POS, ID_COMBOBOX, TBBS_SEPARATOR, COMBOBOX_WIDTH);

                CalcDynamicLayout(0, LM_HORZ | LM_MRUWIDTH | LM_COMMIT);
                bChanged = true;
            }
        }
        else
        {
            if (comboBoxRect.Width() != COMBOBOX_WIDTH)
            {
                SetButtonInfo(COMBOBOX_POS, ID_COMBOBOX, TBBS_SEPARATOR, COMBOBOX_WIDTH);
                CalcDynamicLayout(0, LM_HORZ | LM_HORZDOCK | LM_COMMIT);
                bChanged = true;
            }
        }

        if (bChanged || uParam == 1)
        {
            CRect newComboBoxRect;
            GetItemRect(COMBOBOX_POS, &newComboBoxRect);
            pMainFrame->m_comboBox.MoveWindow(newComboBoxRect, FALSE);
            pMainFrame->ShowControlBar(this, FALSE, FALSE);
            pMainFrame->ShowControlBar(this, TRUE, FALSE);
        }
    }

    return 0L;
}

void CMyToolBar::OnMove(int x, int y)
{
    CToolBar::OnMove(x, y);

    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();

    if (pMainFrame != NULL && ::IsWindow(pMainFrame->m_comboBox.m_hWnd))
    {
        PostMessage(WM_USER + 3, 1);
    }
}

Все попытки реализовать такой код с помощью CMFCToolBar не работают (было создано приложение с CWinAppEx, OnResetToolBar был переопределен, класс производный от CMFCToolBar был реализован (с теми же (более или менее) OnPaint, OnMove и CheckUpdate, со всеми его CalcFixedLayout()< /em>, AdjustSize() и так далее), но это не привело к положительным результатам).

Как необходимо реализовать класс, производный от CMFCToolBar, для достижения необходимого поведения? (а может надо еще что-то сделать?)


Environment
OS Windows 10 x64
Visual Studio Microsoft Visual Studio Community 2019 (Version 16.8.3)
Windows SDK version 10.0
Platform toolset Visual Studio 2019 (v142)

Вот ссылки на проекты для простого воспроизведения ошибок (с шагами воспроизведения):
A проект с CToolBar
проект с CMFCToolBar


PS Приведенные ниже решения не то, что мне нужно.

MFC: как заставить CMFCToolBarComboBoxButton отображаться на CMFCToolBar?

Как задать исходное состояние динамически созданной панели CMFCToolbar?

Как задать исходное состояние динамически созданной панели CMFCToolbar?

Добавление флажка со списком на панель CMFCToolbar

Как заставить CMFCToolBarComboBoxButton работать в вертикальном режиме?< /а>

Как изменить время выполнения CMFCToolBar

CMFCStatusBar изменяет высоту при добавлении значка

Как изменить высоту элемента управления CComboBox?

Как установить размер и прозрачность / Очистить кнопку и значок CMFCToolBar в mfc?

CMFCToolBar и CMFCMenuBar по умолчанию не отображают динамические элементы

CMFCToolBarDateTimeCtrl — внешний вид

Как добавить настраиваемый элемент управления в MFCtoolbar

Как изменить положение кнопки в CMFCToolBar?


person ordinary-developer    schedule 10.04.2021    source источник