MFC:CToolTipCtrl 导致 ASSERT
Posted
技术标签:
【中文标题】MFC:CToolTipCtrl 导致 ASSERT【英文标题】:MFC: CToolTipCtrl causes ASSERT 【发布时间】:2009-09-26 19:24:18 【问题描述】:我已经在一个基于 MFC 并使用 CPropertyPage 的应用程序中成功实现了工具提示。但是,在添加一个按钮以打开一个名为 IDC_USERMSG
的对话框后,该对话框在其中一个 CPropety 页面上包含一个 CEdit 控件,当关闭 IDC_USERMSG
对话框时会引发 Assert。
_AFXWIN_INLINE CWnd* CWnd::GetParent() const
ASSERT(::IsWindow(m_hWnd)); // Asserts here.
return CWnd::FromHandle(::GetParent(m_hWnd));
我相信这是因为 IDC_USERMSG 对话框在此阶段不再存在,因为它已关闭。
按钮/工具提示如下所示。
BEGIN_MESSAGE_MAP(CUserData, CPropertyPage)
// Displays dialog when button pressed
ON_BN_CLICKED(IDC_USERMSG, &CUserData::OnBnClickedUsermsgbtn)
END_MESSAGE_MAP()
BOOL CUserData::OnInitDialog()
EnableToolTips(TRUE);
static CString ToolTip;
CTTCtrl.Create(this); // CToolTipCtrl CTTCtrl is a global
CTTCtrl.SetDelayTime(TTDT_AUTOPOP, 8000);
CTTCtrl.SetMaxTipWidth(ToolTipWidth);
ToolTip.LoadStringW(TT_REN);
CTTCtrl.AddTool( GetDlgItem( IDC_TT_REN), ToolTip );
return 0;
BOOL CUserData::PreTranslateMessage(MSG* pMsg)
CTTCtrl.RelayEvent( pMsg );
CDialog::PreTranslateMessage(pMsg);
// think I need some sort of filter here.
return CDialog::PreTranslateMessage(pMsg);
调用栈
mfc90ud.dll!CWnd::GetParent() Line 297 + 0x2d bytes C++
mfc90ud.dll!CWnd::FilterToolTipMessage(tagMSG * pMsg=0x00155570) Line 392 + 0x8 bytes C++
mfc90ud.dll!CWnd::_FilterToolTipMessage(tagMSG * pMsg=0x00155570, CWnd * pWnd=0x0012fa78) Line 374 C++
mfc90ud.dll!CWnd::PreTranslateMessage(tagMSG * pMsg=0x00155570) Line 1070 C++
mfc90ud.dll!CDialog::PreTranslateMessage(tagMSG * pMsg=0x00155570) Line 56 + 0xc bytes C++
MyApp.exe!CUserData::PreTranslateMessage(tagMSG * pMsg=0x00155570) Line 495 C++
【问题讨论】:
你为什么要调用 CDialog::PreTranslateMessage 两次? 谢伊。好眼力。我错过了。现在工作非常感谢。 【参考方案1】:您正在调用 CDialog::PreTranslateMessag 两次,删除第二次调用。
【讨论】:
以上是关于MFC:CToolTipCtrl 导致 ASSERT的主要内容,如果未能解决你的问题,请参考以下文章