BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
return CDialog::PreTranslateMessage(pMsg);
}1:在上面的这段代码里,我在对话框中敲击一次shift,为什么焦点的移动不是一次而是三次?
2:CDialog *m_p=(CDialog*)AfxGetMainWnd();改成CDialog *m_p=(CDialog*)GetParent();,就会报错??
3:我将if (pMsg->wParam==VK_SHIFT) 改成if (::GetKeyState(VK_SHIFT)<0)焦点就会变换不停,其他事件就无法相应
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
return CDialog::PreTranslateMessage(pMsg);
}1:在上面的这段代码里,我在对话框中敲击一次shift,为什么焦点的移动不是一次而是三次?
2:CDialog *m_p=(CDialog*)AfxGetMainWnd();改成CDialog *m_p=(CDialog*)GetParent();,就会报错??
3:我将if (pMsg->wParam==VK_SHIFT) 改成if (::GetKeyState(VK_SHIFT)<0)焦点就会变换不停,其他事件就无法相应
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
这样写就比较安全也比较实用。
GetParent当对象没有父窗口时返回NULL,m_p->NextDlgCtrl()肯定是非法的
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
这样写就比较安全也比较实用。
i_noname(晚九朝五)
好像不能根本解决第一个问题吧
关注ing
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
}
return CDialog::PreTranslateMessage(pMsg);----------------------------------------------------
如果你处理了以后就不想让系统默认的函数再处理,应在处理后直接返回,而不是再调用CDialog::PreTranslateMessage(pMsg);用下面的代码试试
if (pMsg->wParam==VK_SHIFT)
{
//AfxMessageBox("ad");
CDialog *m_p=(CDialog*)AfxGetMainWnd();
m_p->NextDlgCtrl();
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
你的程序最大问题‘晚九朝五’也说过了,没有事件判断,所以如果wParam为VS_SHIFT的话,就算不按键代码照样执行。为什么会出现连续三下跳转,我估计是事件驱动的原故,你在按SHIFT时程序不只收到WINDOWS的WM_KEYDOWN事件,还将收到WM_KEYUP,这其中还有其它事件会发生,如果wParam值一直是VK_SHIFT,连续跳转是有可能的。
你可以试试看用WM_KEYUP.
如果你不按着SHIFT键的话,GetKeyState(VK_SHIFT)永远都是小于0,因此程序也一直运行此代码,因为你的程序是单线程,所以你程序就一直卡在消息处理过程,说白了也就相当于一个死循环。
晚九朝五也作出很好的答案