MFC Ribbon 在功能区插入按钮问题

bournlee 2014-07-11 09:47:50

问题1:MFC Ribbon在panel添加按钮后panel为什么会变成这样呢?在panel插入一个button后,panel变成不够位置的样子。
问题2:在panel插入button后不会马上显示出变化后的效果,需要将程序最小化、最大化之后才能看到变化。
附图如下:



添加按钮代码如下:

void CMainFrame::OnButton2()
{
// TODO: 在此添加命令处理程序代码
CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);
CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
pPanel->Add(new CMFCRibbonButton(ID_EDIT_CLEAR, _T( "Say Hello"), 1,1));
pPanel->Add( new CMFCRibbonButton(ID_EDIT_CLEAR, _T( "Say Hello"), 2,2));
pPanel->Add( new CMFCRibbonButton(ID_EDIT_CLEAR, _T( "Say Goodbye"),3,3));
}
...全文
596 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bournlee 2014-07-11
  • 打赏
  • 举报
回复
是不是MFC没有人玩了啊?
bournlee 2014-07-11
  • 打赏
  • 举报
回复
不要沉了,继续顶起
bournlee 2014-07-11
  • 打赏
  • 举报
回复
引用 16 楼 sunnyloves 的回复:
这个意思啊 就是动态改变ribbon元素了 我也搞了好久没找到方法
先结贴了,看你最勤快,把分都给你了。
bournlee 2014-07-11
  • 打赏
  • 举报
回复
按照下面的代码已经基本可以实现了,唯一的问题是,旁边的panel折叠起来了。
void CMainFrame::OnButton2()
{
    // TODO: 在此添加命令处理程序代码
    CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);
    CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
    if(pPanel->IsCollapsed())
    {
        AfxMessageBox(_T("折叠"));
    }
    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());
    m_wndRibbonBar.Invalidate();
}
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
这个意思啊 就是动态改变ribbon元素了 我也搞了好久没找到方法
bournlee 2014-07-11
  • 打赏
  • 举报
回复




大致可以实现这个效果了,但是还是有点问题,入上图。代码如下:


void CMainFrame::OnButton2()
{
// TODO: 在此添加命令处理程序代码
CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);
CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
if(pPanel->IsCollapsed())
{
AfxMessageBox(_T("折叠"));
}
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());
//pCategory->SetCollapseOrder();
//pCategory->RecalcLayout(m_wndRibbonBar.GetDC());
//m_wndRibbonBar.RecalcLayout();
}
bournlee 2014-07-11
  • 打赏
  • 举报
回复
引用 13 楼 sunnyloves 的回复:
那你试试
    CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(0);
    CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
资源里可以上传的 或者传到网盘里 提供个外链
代码已上传百度云盘http://pan.baidu.com/s/1c0vjFsG 按照你上面的代码修改之后,变成了没有任何变化了,也就是说代码执行前后程序看不出差别。
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
那你试试
    CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(0);
    CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
资源里可以上传的 或者传到网盘里 提供个外链
bournlee 2014-07-11
  • 打赏
  • 举报
回复
引用 11 楼 sunnyloves 的回复:
另外 没看到你上传的工程啊
引用 10 楼 sunnyloves 的回复:
添加Category是这样的
m_wndRibbonBar.AddCategory(_T("导出"), IDB_FILESMALL, IDB_FILELARGE);
添加Panel是这样
pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (7));
因为我不用新增Category和Panel,所以没有AddCategory,我只是在现有的Panel上新增按钮,csdn这里没找到有添加附件的功能。
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
另外 没看到你上传的工程啊
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
添加Category是这样的
m_wndRibbonBar.AddCategory(_T("导出"), IDB_FILESMALL, IDB_FILELARGE);
添加Panel是这样
pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (7));
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
引用 7 楼 u013327478 的回复:
[quote=引用 4 楼 xianglitian 的回复:] 确实从来没做过Ribbon
引用 5 楼 sunnyloves 的回复:
主页的Category再create 里直接由指针pCategoryHome哎 而且你CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);的索引也不应该是1 而应该是0
引用 6 楼 sunnyloves 的回复:
vs2010里可以直接编辑Ribbon区域 像编辑对话框一样 拖拖放放
是动态创建的,因此Ribbon编辑器完成不了这个功能。 CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);是可以创建的,因此我觉得应该是1啊。[/quote]你是用GetCategory来创建新的Category?那肯定不对的 你没搞清楚 Category panel 是什么东西吧看我这个文章http://blog.csdn.net/sunnyloves/article/details/5810479
bournlee 2014-07-11
  • 打赏
  • 举报
回复
已上传工程文件,麻烦你帮忙看看,先谢谢了~ ps:我是用vs2010创建的MFC SDI工程,直接在mainframe中添加了按钮响应代码的,对框架代码仅有此处修改。代码如下:

void CMainFrame::OnButton2()
{
	// TODO: 在此添加命令处理程序代码
	CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);
	CMFCRibbonPanel *pPanel = pCategory->GetPanel(1);
	if(pPanel->IsCollapsed())
	{
		AfxMessageBox(_T("折叠"));
	}
	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));
	//pCategory->SetCollapseOrder();
	//pCategory->RecalcLayout(GetDC());
	//m_wndRibbonBar.RecalcLayout();
}
bournlee 2014-07-11
  • 打赏
  • 举报
回复
引用 4 楼 xianglitian 的回复:
确实从来没做过Ribbon
引用 5 楼 sunnyloves 的回复:
主页的Category再create 里直接由指针pCategoryHome哎 而且你CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);的索引也不应该是1 而应该是0
引用 6 楼 sunnyloves 的回复:
vs2010里可以直接编辑Ribbon区域 像编辑对话框一样 拖拖放放
是动态创建的,因此Ribbon编辑器完成不了这个功能。 CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);是可以创建的,因此我觉得应该是1啊。
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
vs2010里可以直接编辑Ribbon区域 像编辑对话框一样 拖拖放放
洗洗睡去 2014-07-11
  • 打赏
  • 举报
回复
主页的Category再create 里直接由指针pCategoryHome哎 而且你CMFCRibbonCategory *pCategory = m_wndRibbonBar.GetCategory(1);的索引也不应该是1 而应该是0
向立天 2014-07-11
  • 打赏
  • 举报
回复
确实从来没做过Ribbon

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧