我已经在基于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++
答案 0 :(得分:1)
您正在调用CDialog :: PreTranslateMessag两次,删除第二次调用。