我的代码如下:
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窗口产生,但当我关闭这个对话框时出错,不知怎么回事?
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窗口产生,但当我关闭这个对话框时出错,不知怎么回事?
以上是我程序出现的具体问题。
我是想实现这么给功能,通过点击一个按钮,出现一个密码对话框,输入正确密码进入相应的对话框,或是不输入密码退出,谢谢各位了。这种功能通过鼠标点击按钮非常容易实现,我现在是通过键盘输入产生密码对话框。
PreTranslateMessage是过滤用的,在这里跑DoModal的话,DoModal一结束又继续处理之前的消息会有问题,
2. 这个工作不要在PreTranslateMessage上
1. 点Retry进去看断在哪句上, 才好分析真正原因
PreTranslateMessage是过滤用的,在这里跑DoModal的话,DoModal一结束又继续处理之前的消息会有问题, 不过你可以尝试一下DoModal后return TRUE;
2. 这个工作不要在PreTranslateMessage上做,你可以Post一条自定义消息到主窗口,再由主窗口来dlg.DoModal
return 0; 另外,你的错误可能在于对话框本身。
我用Mackz的方法试了试还错,对话框没问题,因为产生模态对话框的方法按钮操作一点也没错。
想再麻烦一下jasonshark,您说的那种post方法如何去写呢?我在哪些这条自定义语句,代码是什么,然后怎么主窗口去处理,麻烦你了,能不能详细些说!谢谢!
我只能给你写个大概,具体过程你上网一搜很多的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);