Visual Studio 2013中MFC程序自定义工具栏触发Debug Assert失败求助
MFC Debug Assert失败(winctrl3.cpp第237行)解决方法
问题场景
使用Visual Studio 2013通过MFC Application向导创建程序后,运行时依次点击「View」-「Toolbars and Docking Windows」-「Customize」-「Toolbars」,触发Debug Assert失败错误,错误定位在winctrl3.cpp第237行,对应代码片段:
230 if (!fDisabled && ((lpDrawItemStruct->itemState & ODS_SELECTED) != 0)) 231 { 232 pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)); 233 pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT)); 234 } 235 236 if (m_cyText == 0) 237 VERIFY(cyItem >= CalcMinimumItemHeight()); 238 239 CString strText; 240 GetText(lpDrawItemStruct->itemID, strText);
错误原因
该行断言触发的核心逻辑是:当控件的m_cyText(文本高度)为0时,计算出的工具栏项高度cyItem小于控件要求的最小高度。通常由以下情况导致:
- MFC向导生成的代码中,自定义工具栏对话框的列表控件未正确初始化文本高度,
m_cyText未被赋值。 - VS2013 MFC版本存在兼容性问题,调用自定义工具栏对话框时,控件绘制逻辑未正确获取系统字体的文本高度。
- 项目资源中,自定义工具栏对话框的字体被修改为非标准值,导致文本高度计算异常。
解决方法
1. 手动初始化控件文本高度
派生CCustomizeDlg类替换MFC默认的自定义工具栏对话框,在其OnInitDialog函数中添加文本高度初始化代码:
BOOL CMyCustomizeDlg::OnInitDialog() { CCustomizeDlg::OnInitDialog(); // 获取对话框默认字体,计算文本高度 CFont* pFont = GetFont(); if (pFont != nullptr) { CDC* pDC = GetDC(); CFont* pOldFont = pDC->SelectObject(pFont); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); int cyText = tm.tmHeight + tm.tmExternalLeading; // 获取工具栏列表控件,设置m_cyText CListCtrl* pToolbarsList = (CListCtrl*)GetDlgItem(IDC_TOOLBARS); if (pToolbarsList != nullptr) { // 若CListCtrl为自定义派生类,直接访问m_cyText;否则需通过反射修改 pToolbarsList->m_cyText = cyText; } pDC->SelectObject(pOldFont); ReleaseDC(pDC); } return TRUE; }
之后在框架类的OnCustomizeToolbars函数中,使用自定义的CMyCustomizeDlg替代默认对话框。
2. 修正对话框字体设置
打开项目资源视图,找到自定义工具栏对话框(默认ID为IDD_CUSTOMIZE),将对话框的字体设置为系统默认字体(如宋体、微软雅黑,字号保持默认),避免非标准字体导致的文本高度计算错误。
3. 安装VS2013最新更新包
VS2013的Update 5补丁修复了多个MFC控件的兼容性问题,安装该更新后可能直接解决此断言错误。
4. 临时绕过断言(仅调试用)
若需临时运行程序,可在Debug断言弹窗中点击「忽略」按钮,但此方法仅适用于调试阶段,不建议用于发布版本,且无法解决根本问题。
内容的提问来源于stack exchange,提问作者chacebai
相关产品推荐
相关产品推荐

