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的主要内容,如果未能解决你的问题,请参考以下文章

CToolTipCtrl用法

如何修改 CToolTipCtrl 的工具矩形?

CToolTipCtrl 未显示

如何在工具提示中获取新行

是啥导致 MFC 应用程序菜单栏变灰? [关闭]

为啥在 MFC 应用程序中设置 DEBUG_NEW 会导致编译器错误