Visual C++ 2012 动态创建Ribbon 按钮若干问题

来源:互联网 发布:软件工程项目明细 编辑:程序博客网 时间:2024/06/05 12:44

项目因为业务需求需要动态创建 Ribbon 按钮,在网上找了一些代码,如下:

voidCMainFrame::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();
}

运行效果如下:

 

至此解决了恶心的折叠

 

0 0
原创粉丝点击