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


按理说不应该出现这样的错误,弄了半天也没找到原因所在。。求人指点!
...全文
88 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?

16,471

社区成员

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

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

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