MFC:CToolTipCtrl导致ASSERT

时间:2009-09-26 19:24:18

标签: c++ algorithm mfc crash

我已经在基于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++

1 个答案:

答案 0 :(得分:1)

您正在调用CDialog :: PreTranslateMessag两次,删除第二次调用。