0

我有一个 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);
    }
}

实现此类代码的所有尝试均无效(创建了具有CWinAppExCMFCToolBar的应用程序,重写了OnResetToolBar,实现了从CMFCToolBar派生的类(具有相同(或多或少)OnPaintOnMoveCheckUpdate,其所有CalcFixedLayout()AdjustSize()等等),但这并没有带来积极的结果)。

如何实现 CMFCToolBar 派生类来实现所需的行为?(或者可能需要做一些其他的事情?)


环境
操作系统 视窗 10 x64
视觉工作室 Microsoft Visual Studio 社区 2019(版本 16.8.3)
Windows SDK 版本 10.0
平台工具集 视觉工作室 2019 (v142)

以下是项目的链接,便于重现错误(带有重现步骤):
带有 CToolBar
的项目 带有 CMFCToolBar 的项目


PS 以下决定不是我需要的。

MFC:如何让 CMFCToolBarComboBoxButton 显示在 CMFCToolBar 上?

如何设置动态创建的 CMFCToolbar 的原始状态?

如何设置动态创建的 CMFCToolbar 的原始状态?

向 CMFCToolbar 添加复选组合框

如何使 CMFCToolBarComboBoxButton 能够在垂直模式下工作?

如何更改 CMFCToolBar 运行时

添加图标时CMFCStatusBar更改高度

如何更改 CComboBox 编辑控件的高度?

如何在 mfc 中设置大小和透明/清除 CMFCToolBar 按钮和图标?

CMFCToolBar & CMFCMenuBar 默认不显示动态项

CMFCToolBarDateTimeCtrl - 外观

如何在 MFC 工具栏中添加自定义控件

如何更改 CMFCToolBar 中的按钮位置?

4

0 回答 0