项目因为业务需求需要动态创建 Ribbon 按钮,在网上找了一些代码,如下:
void
CMainFrame::OnButton2()
{
// TODO: 在此添加命令处理程序代码
CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);
CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
pPanel->Add(
new
CMFCRibbonButton(ID_EDIT_CLEAR, _T(
"1"
), 1,1));
pPanel->Add(
new
CMFCRibbonButton(ID_EDIT_CLEAR, _T(
"2"
), 2,2));
pPanel->Add(
new
CMFCRibbonButton(ID_EDIT_CLEAR, _T(
"3"
), 3,3));
CRect rc = pPanel->GetRect();
pPanel->RecalcWidths(m_wndRibbonBar.GetDC(),rc.Height());
pCategory->ReposPanels(m_wndRibbonBar.GetDC());
}
结果效果不理想,因为如果有多个Panel 总是有些 Panel 被折叠起来,很是不爽,如下图
点击动态添加按钮,效果如下,按钮是添加上了 Panel 却被折叠起来了
这个就搞的哥很不爽呀,各种调试,各种搜索,都没搞定
最后还得靠自己, 还好MFC rubbon 的各种源码可以看到,并且可以调试,最终
跟踪代码,发现是CDC 传入跟默认调用传入有差异,导致区域计算错误,就折叠起来了。修改代码如下:
void CMainFrame::OnButton2()
{
CTestRibbonCategory *pCategory = (CTestRibbonCategory *)
m_wndRibbonBar.GetCategory(1);
CTestRibbonPanel *pPanel = (CTestRibbonPanel *)pCategory->GetPanel(1);
m_wndRibbonBar.SetRedraw(FALSE);
CClientDC dc(&m_wndRibbonBar);
CFont* pOldFont = dc.SelectObject(m_wndRibbonBar.GetFont());
pPanel->Add( new CMFCRibbonButton(ID_EDIT_CLEAR, _T( "1"), 1,1));
pPanel->Add( new CMFCRibbonButton(ID_EDIT_CLEAR, _T( "2"), 2,2));
pPanel->Add( new CMFCRibbonButton(ID_EDIT_CLEAR, _T( "3"), 3,3));
for(int i = 0; i < pCategory->GetPanelCount(); i++)
{
pPanel = (CTestRibbonPanel *)pCategory->GetPanel(i);
CRect rc = pPanel->GetRect();
pPanel->RecalcWidths(&dc, rc.Height());
}
pCategory->ReposPanels(&dc);
dc.SelectObject(pOldFont);
m_wndRibbonBar.Invalidate();
m_wndRibbonBar.SetRedraw(TRUE);
m_wndRibbonBar.RedrawWindow();
}
运行效果如下:
至此解决了恶心的折叠