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)焦点就会变换不停,其他事件就无法相应

解决方案 »

  1.   

    WM_KEYDOWN,WM_KEYUP,WM_CHAR等消息都会用wParam来保存按键消息,所以你的代码很危险。if (pMsg->message == WM_KEYDOWN)
    if (pMsg->wParam==VK_SHIFT)
    {
    //AfxMessageBox("ad");
    CDialog *m_p=(CDialog*)AfxGetMainWnd();
    m_p->NextDlgCtrl();
    }
    这样写就比较安全也比较实用。
      

  2.   

    CDialog *m_p=(CDialog*)GetParent();
    GetParent当对象没有父窗口时返回NULL,m_p->NextDlgCtrl()肯定是非法的
      

  3.   

    WM_KEYDOWN,WM_KEYUP,WM_CHAR等消息都会用wParam来保存按键消息,所以你的代码很危险。if (pMsg->message == WM_KEYDOWN)
    if (pMsg->wParam==VK_SHIFT)
    {
    //AfxMessageBox("ad");
    CDialog *m_p=(CDialog*)AfxGetMainWnd();
    m_p->NextDlgCtrl();
    }
    这样写就比较安全也比较实用。
     i_noname(晚九朝五) 
     好像不能根本解决第一个问题吧 
    关注ing
      

  4.   

    if (pMsg->wParam==VK_SHIFT)
    {
    //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);
      

  5.   

    windows是基于事件驱动,所以windows程序也如此。windows窗体在运行时是在一个while循环里不停的运行,一个好的while循环虽然对事件有判断的能力,但对windows输入任何消息时它都会把消息注入相应的应用程序当中,当你按下一个并放开就PRESS事件,当你按下键但不放开时是DOWN事件,两个事件虽为按键消息,但还是有不同之处。
        你的程序最大问题‘晚九朝五’也说过了,没有事件判断,所以如果wParam为VS_SHIFT的话,就算不按键代码照样执行。为什么会出现连续三下跳转,我估计是事件驱动的原故,你在按SHIFT时程序不只收到WINDOWS的WM_KEYDOWN事件,还将收到WM_KEYUP,这其中还有其它事件会发生,如果wParam值一直是VK_SHIFT,连续跳转是有可能的。
        你可以试试看用WM_KEYUP.
      

  6.   

    3:我将if (pMsg->wParam==VK_SHIFT) 改成if (::GetKeyState(VK_SHIFT)<0)焦点就会变换不停,其他事件就无法相应
        
        如果你不按着SHIFT键的话,GetKeyState(VK_SHIFT)永远都是小于0,因此程序也一直运行此代码,因为你的程序是单线程,所以你程序就一直卡在消息处理过程,说白了也就相当于一个死循环。
    晚九朝五也作出很好的答案