江湖救急,一个十分古怪的问题,我怀疑是MFC的bug,我是认真的,请达人过来帮手,谢谢.
我使用VC6+sp6,最近做工程时发现一个十分古怪的问题,在一个SDI项目(应该MDI也是)中,因定义了hotkey,所以重载了PreTranslateMessage函数以获得消息,这时发现在这个函数里弹出自定义的对话框之后出现Assert错误!跟踪进去,发现在tooltip.cpp里的FromHandle函数发生的.一开始以为自己程序的问题,所以做了一个测试的项目,如果也有这样的问题,代码如下:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_CHAR)/////这里可以是任意消息,当然,最好是常见的.
{
// MessageBox("hahaha");
///////////////////////////////////////
////////////////////////////////
///MFC的bug??
///在PreTranslateMessage函数里弹出一个自定义对话框会出现错误???
CMyDlg dlg;
dlg.DoModal();
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
其中CMyDlg是自定义的对话框类,极简单,完成是默认生成的.
各位请帮帮忙,救急啊!!!谢谢了,要测试项目的朋友请留下email,我发给你们,谢谢了.
问题点数:0、回复次数:8Top
1 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-01 09:47:41 得分 0
CMyDlg dlg;
dlg.DoModal();
return TRUE; // 加上这句
}Top
2 楼zdingyi(游戏大王)回复于 2005-06-01 12:30:05 得分 0
关注中Top
3 楼lanphaday(恋花蝶)回复于 2005-06-01 13:05:51 得分 0
CMyDlg dlg;
dlg.DoModal();
return TRUE; // 加上这句
}
为什么必须要返回?Top
4 楼weirdy(远古传说)回复于 2005-06-01 15:37:26 得分 0
dlg.DoModal()截住了界面消息,所以返回时原来的pMsg的内容已经更改了,消息,窗口句柄都不在是if以前的值了,而且窗口句柄应该是对话框里的子窗口的句柄,所以调用CFrameWnd::PreTranslateMessage(pMsg);
时pMsg的窗口句柄是个无效值(窗口已销毁)
Top
5 楼weirdy(远古传说)回复于 2005-06-01 15:43:07 得分 0
改成这样就OK了,
if (pMsg->message == WM_CHAR)
{
MSG msg = *pMsg;
CMyDlg dlg;
dlg.DoModal();
*pMsg = msg;
}
我估计是MFC保存了一个当前消息的结构来跟踪消息路由,dlg.DoModal();时这个结构的值都更新好多遍了Top
6 楼dongfa(一桶江湖( http://www.codelive.net ))回复于 2005-06-02 09:46:11 得分 0
因为模式对话框有独立的消息循环.
Top
7 楼gooyan(超级替补)回复于 2005-06-02 10:11:41 得分 0
不要破坏消息循环,否则会挂死的Top
8 楼aben456(金珠MERP)回复于 2005-06-02 10:22:21 得分 0
有道理Top




