Visual C++ 2012 动态创建Ribbon 按钮若干问题
来源:互联网 发布:软件工程项目明细 编辑:程序博客网 时间:2024/06/05 12:44
项目因为业务需求需要动态创建 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();
}
运行效果如下:
至此解决了恶心的折叠
- Visual C++ 2012 动态创建Ribbon 按钮若干问题
- 动态创建Ribbon 按钮
- MFC Ribbon 动态添加按钮
- Visual C++ 2010创建Ribbon界面
- Visual C++ 2010创建Ribbon界面
- Visual C++ 2010创建Ribbon界面
- Visual C++ 2010创建Ribbon界面(上)
- Visual C++ 2010创建Ribbon界面(下)
- Ribbon2: 创建动态的Ribbon库
- SharePoint 2010/2013 使用Javascript 动态添加Ribbon 按钮
- 动态创建按钮
- SDK动态创建按钮
- 动态创建一个按钮
- VC 动态创建按钮
- VC 动态创建按钮
- 动态创建按钮
- 动态创建按钮
- 动态创建按钮
- 使用WebView显示GIF图
- 基于requirejs实现angular的按需加载
- 面向对象设计的基本原则
- 第二题
- How to point to 32 bit IBM DB2 ODBC driver on 64-bit Microsoft system?
- Visual C++ 2012 动态创建Ribbon 按钮若干问题
- autolayout Compact,Regular,Any 解析
- Session过期,如何跳出iframe框架页的问题
- MyEclipse10中配置开发Python所需要的PyDev 绝对靠谱 不忽悠!
- 实现将Android项目发布到GitHub上面
- UVa 10081 - Tight Words
- 反代理google网站
- Python二维码生成库qrcode安装和使用示例
- Android Api Demos登顶之路(二十三)SoftInputModes