在EDIT控件中,按动键盘上/下箭头键会增减EDIT中的数字。
请问,如何在CSpinButtonCtrl中截获键盘的上/下箭头键的消息?*查阅MSDN:提示需处理WM_KEYDOWN/WM_KEYUP,但是却没有任何消息流经此处。
          (鼠标消息可截获即WM_LBUTTONDOWN/WM_LBUTTONUP)。

解决方案 »

  1.   

    只能重载CSpinButtonCtrl,自己处理所有的Windows消息
      

  2.   

    处理UDN_DELTAPOS通知即可.afx_msg void OnDeltaposMySpin(NMHDR* pNMHDR, LRESULT* pResult);
    ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_BR_ALPHA, OnDeltaposMySpin)void CDlgTest::OnDeltaposMySpin(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; if(pNMUpDown->iDelta==1){//Up
    //Your Code
    }
    else{//down
    //Your
    } *pResult = 0;
    }
      

  3.   

    to 96163:
       我已查了MSDN,里面说按压键盘的上下箭头会接到WM_KEYDOWN和WM_KEYUP消息。重载 CSpinButtonCtrl类,在重载类中指定了 WM_KEYDOWN 和 WM_KEYUP但是还是无法截获按压键盘上下箭头消息。
       另:鼠标消息可截获(WM_LBUTTONDOWN, WM_LBUTTONUP)to Sinqi:
        我没说明白,我想知道的是用户何时被按下/弹起箭头键
      

  4.   

    MSDN说得不对不啊,CSpinButtonCtrl类根本就没有处理WM_KEYDOWN与WM_KEYUP消息!!!
    (我已指定了UDS_ARROW样式)高手们帮帮忙啊!!!!
      

  5.   

    我不想控制UDN_DELTAPOS消息。
    我只是想在用户按下CSpinButtonCtrl控件后,键盘或鼠标左键弹起(WM_KEYUP)时更新一个视图。如果用户一直按着键盘或鼠标左键不动,一直更新视图会出现视图闪烁,同时浪费资源。所以,我只是想知道何时,用户按下上/下箭头时,键钮何时被弹起。当弹起时,我截获这段消息来更新相应的视图。唉。看来是无解了。
      

  6.   

    因为这个Spin根本没有获得焦点,
    这里假设在左击时让其有焦点。
    BOOL CYourDlg::PreTranslateMessage(MSG* pMsg) //父窗
    {
    if(pMsg->message == WM_KEYDOWN)
    {
    switch(pMsg->wParam)
    {
    case VK_UP:
    return TRUE;
    case VK_DOWN:
    return TRUE;
    }

    }

    return CDialog::PreTranslateMessage(pMsg);
    }
    void CMySpin::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    if(nChar == VK_UP)
    AfxMessageBox("VK_UP");
    if(nChar == VK_DOWN)
    AfxMessageBox("VK_DOWN"); CSpinButtonCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
    }void CMySpin::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    SetFocus();
    CSpinButtonCtrl::OnLButtonDown(nFlags, point);
    }
    这样你先在它上面用鼠标左击后使用上下箭头就有效了。当然你也可以在其它情况让其有焦点。
      

  7.   

    我已重载了CSpin类,能否将其放到自己的类中执行?
      

  8.   

    上面那个CMySpin就是指的你那个重载了的CSpin类呀?至于“BOOL CYourDlg::PreTranslateMessage(MSG* pMsg) //父窗”这一句,
    那是因为对于对话窗等来说上下箭头键已被用来切换控件的焦点,直接return TRUE以防止它切换掉你的Spin的焦点。