通过键盘的上下键可以上下移动列表的所选项,如何得到这个事件,它是什么事件。
另,我想在所选项上按回车键弹出一个对话框,请问这又是什么事件,我试了试NM_RETURN 没有成功

解决方案 »

  1.   

    ExampleTo specify that you want the member function OnKeydownList1 to handle LVN_KEYDOWN messages from the CListCtrl whose ID is IDC_LIST1, you would use ClassWizard to add the following to your message map:ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )In the example above, the function provided by ClassWizard is:void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
    {
       LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
       // TODO: Add your control notification handler
       //       code here
       
       *pResult = 0;
    }
      

  2.   

    谢谢,但是我试了一下发现VK_UP,VK_DOWN可以响应,而VK_ENTER 不能响应不知何故我感觉当通过键盘上下键改变列表选项时,列表控件应可以直接响应这一选项改变的事件,不必通过处理LVN_KEYDOWN事件,可我没有找到
      

  3.   

    是 VK_RETURN 不是 VK_ENTER
      

  4.   

    不知大家明白我的意思了没有
    我的要求是:通过键盘上下键改变列表选项,然后按回车键弹出一个对话框,上面已经说过VK_UP,VK_DOWN可以响应,VK_RETURN不能响应,可是如果你用鼠标点下不要抬起,再按回车键VK_RETURN就能响应了,不知何故,这显然不是我要求的
      

  5.   

    BOOL CFairyDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if (pMsg->message==WM_KEYDOWN)
    {
    switch(pMsg->wParam)
    {
    case VK_DOWN:
    pMsg->wParam=0;          // 使键值为0,防止其他控件再处理
    m_List.SetCurSel(m_List.GetCurSel() + 1); break;
    case VK_UP:        
    pMsg->wParam=0; 
    if(m_List.GetCurSel() != 0)
       m_List.SetCurSel(m_List.GetCurSel() - 1); break;
    case VK_ESCAPE:
    SendMessage(WM_CLOSE);
    AfxGetMainWnd()->SetFocus(); break;
    case VK_RETURN:
    pMsg->wParam=0; 
    CString str;
    int nSel = m_List.GetCurSel(); // 防止选中时无数据
    if(nSel >= 0)
    {
    m_List.GetText(nSel,str);
    SendMessage(WM_CLOSE);
    if(!str.IsEmpty())
    AfxMessageBox(str);
    } break;
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
    }