我现在使用ListView控件读出各个盘符中的文件列表,使用上下键即可实现对文件列表的选择
现在若用字母键w实现上键动能,s键实现下键功能,该如何去做

解决方案 »

  1.   

    是不是listView里默认上下键控制的啊,因为里面没有看到onkeydown()啊
      

  2.   

    在键盘消息里
    获取当前选择的项GetSelectionMark
    如果想上移焦点就在这个值上减一
    下移就加一
    设置选中用SetItemState
      

  3.   

    得到当前的item号.按w item-1,s item+1
    SetItemStata(item,未选择)
    SetItemStata(item+-1,选择)
      

  4.   

    在PreTranslateMessage()里面截获w键,然后处理就行了。
      

  5.   

    index=m_List.GetNextItem(-1,LVNI_SELECTED)-1;
    index=GetSelectionMark()-1;
    m_List.SetItemState (index,0x2000, LVS_SHOWSELALWAYS);//设为选中状态
    这样做,为什么不行呢?
      

  6.   

    m_List.SetItemState(inde, LVIS_SELECTED, LVIS_SELECTED);   
      

  7.   

    增加ListView对WM_CHAR的响应,OnChar()函数如下,测试过可以的.void CRegListView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    if (nChar == 'w' || nChar == 'W')
    {
    CListCtrl& List = GetListCtrl();
    int pos = int(List.GetFirstSelectedItemPosition()) - 1;
    if (pos > 0)
    {
    List.SetItemState(pos,0,LVIS_SELECTED);
    List.SetItemState(pos-1,LVIS_SELECTED,LVIS_SELECTED);
    }
    return;
    }
    if (nChar == 's' || nChar == 'S')
    {
    CListCtrl& List = GetListCtrl();
    int pos = int(List.GetFirstSelectedItemPosition()) - 1;
    if (pos < List.GetItemCount() - 1)
    {
    List.SetItemState(pos,0,LVIS_SELECTED);
    List.SetItemState(pos+1,LVIS_SELECTED,LVIS_SELECTED);
    }
    return;
    }
    //其他的字符照常处理
    CListView::OnChar(nChar, nRepCnt, nFlags);
    }
      

  8.   

    在LISTVIEW里增加WM_CHAR响应void CRegListView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    // TODO: Add your message handler code here and/or call default
    if (nChar == 'w' || nChar == 'W')
    {
    CListCtrl& List = GetListCtrl();
    int pos = int(List.GetFirstSelectedItemPosition()) - 1;
    if (pos > 0)
    {
    List.SetItemState(pos,0,LVIS_SELECTED);
    List.SetItemState(pos-1,LVIS_SELECTED,LVIS_SELECTED);
    }
    return;
    }
    if (nChar == 's' || nChar == 'S')
    {
    CListCtrl& List = GetListCtrl();
    int pos = int(List.GetFirstSelectedItemPosition()) - 1;
    if (pos < List.GetItemCount() - 1)
    {
    List.SetItemState(pos,0,LVIS_SELECTED);
    List.SetItemState(pos+1,LVIS_SELECTED,LVIS_SELECTED);
    }
    return;
    }
    //其他的字符照常处理
    CListView::OnChar(nChar, nRepCnt, nFlags);
    }
      

  9.   

    m_List.SetItemState(inde, LVIS_SELECTED, LVIS_SELECTED);
      

  10.   

    真巧,我也正想学着搞文件列表,学习ing。
      

  11.   


    你的listctrl是不是没设置single selection
    如果你不需要同时选中多行的话这个项应该设为true
      

  12.   

    listctrl在哪里设置single selection呢?
      

  13.   

    我不知道w和s的键盘值是多少,假设是 w,s写着重载的PreTranslateMessage()里
    if(pMsg->wParam==w)
    {
    pMsg->wParam=up;//(up假设是方向键上的值)
    }
    if(pMsg->wParam==s)
    {
    pMsg->wParam=do;//(do假设是方向键下的值)
    }
      

  14.   

    不是对话框中,是在单文档中继承ListView
      

  15.   

    Create的时候Style属性中
    |LVS_SINGLESEL