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