我有一个 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派生的类(具有相同(或多或少)OnPaint、OnMove和CheckUpdate,其所有CalcFixedLayout(),AdjustSize()等等),但这并没有带来积极的结果)。
如何实现 CMFCToolBar 派生类来实现所需的行为?(或者可能需要做一些其他的事情?)
环境 | |
---|---|
操作系统 | 视窗 10 x64 |
视觉工作室 | Microsoft Visual Studio 社区 2019(版本 16.8.3) |
Windows SDK 版本 | 10.0 |
平台工具集 | 视觉工作室 2019 (v142) |
以下是项目的链接,便于重现错误(带有重现步骤):
带有 CToolBar
的项目 带有 CMFCToolBar 的项目
PS 以下决定不是我需要的。
MFC:如何让 CMFCToolBarComboBoxButton 显示在 CMFCToolBar 上?
如何使 CMFCToolBarComboBoxButton 能够在垂直模式下工作?
如何在 mfc 中设置大小和透明/清除 CMFCToolBar 按钮和图标?