参考文章:http://www.vckbase.com/index.php/wv/1548
ON_NOTIFY处理listControl消息,但此方法的report风格只有第一列能编辑
代码示例:
设置listcontrol属性Edit Labels为True
BEGIN_MESSAGE_MAP(CBoreEditDlg, CDialogEx)
ON_NOTIFY(NM_DBLCLK, IDC_LIST3, &CBoreEditDlg::OnDblclkList3)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST3, &CBoreEditDlg::OnEndlabeleditList3)
END_MESSAGE_MAP()
void C***Dlg::OnDblclkList3(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
POSITION pos = m_list2.GetFirstSelectedItemPosition();
int tIndex = m_list2.GetNextSelectedItem(pos);
if ( tIndex >= 0 )
{
m_list2.SetFocus();
CEdit* pEdit = m_list2.EditLabel( tIndex );
}
}
void C***Dlg::OnEndlabeleditList3(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
CString pName = pDispInfo->item.pszText;
int tIndex = pDispInfo->item.iItem;
m_list2.SetFocus();
if( ( ! pName.IsEmpty() ) && tIndex >= 0 )
m_list2.SetItemText( tIndex, 0, pName);
}
以下方法可实现对子项的修改
当你单击CListCtrl控件时,使其中的一行高亮显示。当你双击CListCtrl控件时,将一个CEdit(编辑框)控件移动到你所双击的列中(CEdit控件中显示你所单击列的内容)所在的位置。并使CEdit控件获取焦点。然后,你可以修改CEdit中的内容。当你的鼠标点击其他地方,CEdit将失去焦点,同时,我们将CEdit中的内容更新到CListCtrl中,从而完成了对CListCtrl的子项的修改。
首先在对话框中添加一个CEdit控件,并定义CEdit变量m_edit。当对话框初始化函数中隐藏该控件。
m_edit.ShowWindow(SW_HIDE);
然后对CListCtrl添加消息NM_DBLCLK(双击事件),在消息中添加代码
NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
CRect rc;
if(pNMListView->iItem!=-1)
{
m_row=pNMListView->iItem;//m_row为被选中行的行序号(int类型成员变量)
m_column=pNMListView->iSubItem;//m_column为被选中行的列序号(int类型成员变量)
if (m_edit.m_hWnd==NULL)
m_edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,1002);
m_edit.SetParent(&m_list);
m_list.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子项的矩形
char * ch=new char [128];
m_list.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//取得子项的内容
m_edit.SetWindowText(ch);//将子项的内容显示到编辑框中
m_edit.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),SWP_SHOWWINDOW);
m_edit.SetFocus();//使编辑框取得焦点
m_edit.CreateSolidCaret(1,rc.Height()-5);//创建一个光标
m_edit.ShowCaret();//显示光标
m_edit.SetSel(-1);//使光标移到最后面
}
*pResult = 0;
然后,添加CEdit失去焦点时的消息EN_KILLFOCUS。在该消息中添加代码使编辑框中的内容更新到CListCtrl中。
CString str;
if(m_edit.m_hWnd!=NULL)
{
m_edit.GetWindowText(str);//取得编辑框的内容
m_list.SetItemText(m_row,m_column,str);//将该内容更新到CListCtrl中
m_edit.ShowWindow(SW_HIDE);//隐藏编辑框
}