我的代码如下:
BOOL CKeytest3Dlg::PreTranslateMessage(MSG* pMsg) 
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message)   
{   
case   WM_KEYDOWN:   
switch(pMsg->wParam)   
{   
case   VK_CAPITAL:   
dlg.DoModal();
break;   
default:   
break;   
}   
break;   
default:   
break; 
}  
return CDialog::PreTranslateMessage(pMsg);
}
当我按下VK_CAPITAL键时,dlg窗口产生,但当我关闭这个对话框时出错,不知怎么回事?

解决方案 »

  1.   

    不要在PreTranslateMessage中干DoModal这种劫持消息循环的事情要具体分析原因的话,请把出错的具体位置和信息贴出来
      

  2.   

    就是运行上面的代码后,对话框出现,但一关闭这个对话框就出现一个Assertion Failed! 的错误对话框,上面还写着:Keytest3:File wincore.cpp,Line 1043,并给我三种选择:Abort ,Retry,Ingnore
    以上是我程序出现的具体问题。
    我是想实现这么给功能,通过点击一个按钮,出现一个密码对话框,输入正确密码进入相应的对话框,或是不输入密码退出,谢谢各位了。这种功能通过鼠标点击按钮非常容易实现,我现在是通过键盘输入产生密码对话框。
      

  3.   

    1. 点Retry进去看断在哪句上, 才好分析真正原因
    PreTranslateMessage是过滤用的,在这里跑DoModal的话,DoModal一结束又继续处理之前的消息会有问题,
    2. 这个工作不要在PreTranslateMessage上
      

  4.   

    Sorry, 按到tab键, 一不消息提交了
    1. 点Retry进去看断在哪句上, 才好分析真正原因
    PreTranslateMessage是过滤用的,在这里跑DoModal的话,DoModal一结束又继续处理之前的消息会有问题, 不过你可以尝试一下DoModal后return TRUE;
    2. 这个工作不要在PreTranslateMessage上做,你可以Post一条自定义消息到主窗口,再由主窗口来dlg.DoModal
      

  5.   

    dlg.DoModal();  
    return 0; 另外,你的错误可能在于对话框本身。
      

  6.   

    首先,谢谢各位。
    我用Mackz的方法试了试还错,对话框没问题,因为产生模态对话框的方法按钮操作一点也没错。
    想再麻烦一下jasonshark,您说的那种post方法如何去写呢?我在哪些这条自定义语句,代码是什么,然后怎么主窗口去处理,麻烦你了,能不能详细些说!谢谢!
      

  7.   

    厄.... 你没写过自定义消息...?
    我只能给你写个大概,具体过程你上网一搜很多的1. Keytest3Dlg.h 中自定义消息 #define WM_POPUP_NEWDLG WM_USER + 0x10
    2. Keytest3Dlg.h 中声明一个函数,LRESULT OnPopupNewDlg(WPARAM, LPARAM);
    3. Keytest3Dlg.cpp中定义这个函数
    LRESULT OnPopupNewDlg(WPARAM wp, LPARAM lp)
    {
    UNREFERENCED_PARAMETER(wp);
    UNREFERENCED_PARAMETER(lp);CYourDlg dlg;
    dlg.DoModal();
    }
    4.Keytest3Dlg.cpp中进行消息映射
      ON_MESSAGE(WM_POPUP_NEWDLG, OnPopupNewDlg)5.在你PreTranslateMessage中刚才DoModal那个地方, this->PostMessage(WM_POPUP_NEWDLG);