CReBar导致的debug assertion failed错误!

奋起无迹 2015-10-20 12:08:09

CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中

if (!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar(&m_wndMenuBar) ||
!m_wndReBar.AddBar(&m_wndToolBar, NULL, NULL,
RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK) ||
!m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP) ||
!m_wndReBar.AddBar(&m_wndAddress, strAddressLabel, NULL,
RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK) ||
!m_wndReBar.AddBar(&m_wndLinksBar, strLinksLabel, NULL,
RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP | RBBS_BREAK))
{
TRACE0("Failed to create rebar\n");
return -1; // fail to create
}



void CBCGToolBar::AdjustLayout ()
{
if (GetSafeHwnd () == NULL)
{
return;
}

CReBar* pBar = DYNAMIC_DOWNCAST (CReBar, GetParent());
if (pBar != NULL)
{
CReBarCtrl& wndReBar = pBar->GetReBarCtrl ();
UINT uiReBarsCount = wndReBar.GetBandCount ();

REBARBANDINFO bandInfo;
bandInfo.cbSize = sizeof (bandInfo);
bandInfo.fMask = (RBBIM_CHILDSIZE | RBBIM_CHILD);
UINT uiBand;
for ( uiBand = 0; uiBand < uiReBarsCount; uiBand ++)
{
wndReBar.GetBandInfo (uiBand, &bandInfo);
if (bandInfo.hwndChild == GetSafeHwnd ())
{
break; //循环中找不到this对象的m_hWnd,无法跳出循环
}
}

if (uiBand >= uiReBarsCount)

{
ASSERT (FALSE); //这儿出错
}
else
{
CSize sizeMin = CalcSize (FALSE);

CRect rect; rect.SetRectEmpty();
CalcInsideRect (rect, TRUE);
sizeMin.cy -= rect.Height();
sizeMin.cx -= rect.Width();

CSize size = CControlBar::CalcFixedLayout (FALSE, TRUE);
sizeMin.cx = max(sizeMin.cx, size.cx);
sizeMin.cy = max(sizeMin.cy, size.cy);

bandInfo.cxMinChild = sizeMin.cx;
bandInfo.cyMinChild = sizeMin.cy;

wndReBar.SetBandInfo (uiBand, &bandInfo);
wndReBar.MinimizeBand (uiBand);
}
}
else
{
CFrameWnd* pParent = GetParentFrame ();
if (pParent != NULL && pParent->GetSafeHwnd () != NULL)
{
pParent->RecalcLayout ();
}
}

AdjustLocations ();
UpdateWindow ();
Invalidate ();
}


按理说不应该出现这样的错误,弄了半天也没找到原因所在。。求人指点!
...全文
165 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
奋起无迹 2015-10-23
  • 打赏
  • 举报
回复
终于找到了解决的办法。 跟踪AddBar函数,再里面发现它是把bandInfo.cbSize 设置成80的,这是旧版本的大小。 而bandInfo.cbSize = sizeof (bandInfo),会把cbSize 设置成100,在这儿也设置成80, 就能跳出循环了。
shao99 2015-10-20
  • 打赏
  • 举报
回复
uiBand ,uiReBarsCount 两个变量相等的吧,满足条件啊,当然ASSERT
奋起无迹 2015-10-20
  • 打赏
  • 举报
回复
引用 1 楼 shao99 的回复:
uiBand ,uiReBarsCount 两个变量相等的吧,满足条件啊,当然ASSERT
应该在循环中找到相等值,跳出循环的。。
奋起无迹 2015-10-20
  • 打赏
  • 举报
回复


明明已经 bandInfo.fMask = RBBIM_CHILDSIZE | RBBIM_CHILD;
为什么 .hwndChild 还是unused?
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 平台简介 License Spring Boot JDK-17 本项目基于ruoyi-vue-fast实现 项目代码、文档 均开源免费可商用 遵循开源协议在项目中保留开源协议文件即可 活到老写到老 为兴趣而开源 为学习而开源 为让大家真正可以学到技术而开源 若依wms是一套基于若依的wms仓库管理系统,支持lodop和网页打印入库单、出库单。 毫无保留给个人及企业免费使用。 前端采用Vue、Element UI。 后端采用Spring Boot、Spring Security、Redis & Jwt。 权限认证使用Jwt,支持多终端认证系统。 支持加载动态权限菜单,多方式轻松权限控制。 高效率开发,使用代码生成器可以一键生成前后端代码。 前端项目地址 gitee https://gitee.com/zccbbg/ruo-yi-wms-vue https://.com/zccbbg/RuoYi-WMS-VUE 若依实战技术专栏 关注文末公众号回复:星球 在线体验 https://wms.ichengle.top/ 不同分支介绍 jdk17+vue3,支持多仓库,没有库区概念,操作简单,覆盖大部分库存应用场景。 jdk17+vue3,支持多仓库、多库区,记录生产日期、过期日期、sn,可适配一物一码,操作相对复杂。 jdk8+vue2 同步lite分支 若依wms功能 首页:库存预警与到期提醒、基础数据报表展示 仓库/库区:管理维护仓库基础数据 物料:管理维护物料基础数据 客户/供应商:管理维护联系人基础数据 入库:创建入库单后包括如下几个状态:暂存、作废、完成入库,入库类型包括:采购...

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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