我在Dialog中加入一个ListCtrl(report),ListCtrl中加了一个edit编辑框,做成可以编辑修改除第一列外的所有列。NM_DCLICK消息就是在ListCtrl中双击某个列项,进入编辑状态。为了保存修改,我用了NM_CLICK消息映射一个函数,在里面添加我的保存代码。但是却没有能够保存。又试了WM_LBUTTONDOWN消息,用这个消息却能实现我想要的功能。但是用WM_LBUTTONDOWN消息,做出来的东西操作起来就太麻烦了啊。求高手指点是什么问题。

解决方案 »

  1.   

    你应该子类话CEdit编辑框,处理WM_MOUSEHOVER,WM_MOUESLEAVE消息
      

  2.   

    Sorry,这个有个问题,鼠标离开了就会进入WM_MOUSELEAVE中。还是在CListCtrl中的WM_LBUTTONDOWN吧
      

  3.   

    你可以到codeproject上找找类似的
      

  4.   


    最后我还是用了ListCtrl中的NM_CLICK消息。改了一下用来保存修改的代码
    void CxmllistDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
    { CWnd* pwndCtrl = GetFocus();
        // 得到目前焦点所在控件的ID
    int ctrl_ID = pwndCtrl->GetDlgCtrlID();
    CString str;
        switch (ctrl_ID)
    { //如果控件是Edit box
            case IDC_EDIT1:

    GetDlgItemText(IDC_EDIT1,str);

    SetCell(::GetDlgItem (m_hWnd,IDC_LIST1),str,nItem,nSubItem);
    ::SendDlgItemMessage(m_hWnd,IDC_EDIT1,WM_KILLFOCUS,0,0);
    ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);
                break;     
            default:
                break;
        } *pResult = 0;
    }void CxmllistDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CWnd* pwndCtrl = GetFocus();
        
    int ctrl_ID = pwndCtrl->GetDlgCtrlID();
    CString str;
        switch (ctrl_ID)
    {
            case IDC_EDIT1:

    GetDlgItemText(IDC_EDIT1,str);

    SetCell(::GetDlgItem (m_hWnd,IDC_LIST1),str,nItem,nSubItem);
    ::SendDlgItemMessage(m_hWnd,IDC_EDIT1,WM_KILLFOCUS,0,0);
    ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);
                break;     
            default:
                break;
        }
    CDialog::OnLButtonDown(nFlags, point);
    }
    这是分别在NM_CLICK 和 WM_LBUTTONDOWN中的代码。
    void CxmllistDlg::SetCell( HWND hWnd1,  CString value, int nRow, int nCol )
    {
    TCHAR     szString [256];
    wsprintf(szString,value ,0);
    LVITEM lvItem;
    lvItem.mask = LVIF_TEXT;
    lvItem.iItem = nRow;
    lvItem.pszText = szString;
    lvItem.iSubItem = nCol;
    if(nCol >0)
    ::SendMessage(hWnd1,LVM_SETITEM, (WPARAM)0,(WPARAM)&lvItem);
    else
    ListView_InsertItem(hWnd1,&lvItem);
    }
    这是自定义的SetCell用来对ListCtrl插入项的。和setItemText的作用相同。
    最后我们总监让我把NM_CLICK中的代码改成
    CListCtrl* ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
    if(ctl)
    {
    ctl->SetItemText(nItem,nSubItem,str);
    }
    就好了。
    至于为什么我写的只能在wM_LBUTTONDOWN中实现我还没弄明白。