http://www.cnblogs.com/604608/archive/2009/08/20/1550531.html
http://www.cnblogs.com/duzouzhe/archive/2010/04/01/1702411.html
这是2个不错的法子,我实现了一个版本:
private:
HWND m_hEdit;
BOOL m_bIsEdited; //是否编辑过
int m_nItem, m_nSubItem; // 记录上一次的项、子项
afx_msg void OnDbClickList(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMKillfocusList1(NMHDR *pNMHDR, LRESULT *pResult);
void CMultipleColumnsDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
//LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;
if( (m_nItem<0) || (m_nSubItem<0) || !m_bIsEdited)
return ;
TCHAR buf[MAX_PATH]={0};
ASSERT(m_hEdit);
::GetWindowText(m_hEdit,buf,MAX_PATH);
::ShowWindow(m_hEdit,SW_HIDE);
m_List.SetItemText(m_nItem,m_nSubItem,buf);
m_bIsEdited=FALSE;
//*pResult = 0;
}
void CMultipleColumnsDlg::OnDbClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;
if( (temp->iItem< 0 )|| (temp->iSubItem<0) )
return ;
//记录
m_nItem=temp->iItem;
m_nSubItem=temp->iSubItem;
CString str = GetItemText(temp->hdr.hwndFrom,temp->iItem ,temp->iSubItem);
RECT rect; //子矩形大小
ListView_GetSubItemRect(temp->hdr.hwndFrom,temp->iItem,temp->iSubItem,LVIR_BOUNDS,&rect);
ASSERT(m_hEdit);
::MoveWindow(m_hEdit,rect.left+1,rect.top+1,rect.right-rect.left-2,rect.bottom-rect.top-2,TRUE);
::ShowWindow(m_hEdit,SW_SHOW);
::SetFocus(m_hEdit);
::SetWindowText(m_hEdit,str);
m_bIsEdited=TRUE;
//*pResult = 0;
}
void CMultipleColumnsDlg::OnNMKillfocusList1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
if( (m_nItem<0) || (m_nSubItem<0) ||!m_bIsEdited )
return ;
TCHAR buf[MAX_PATH]={0};
ASSERT(m_hEdit);
::GetWindowText(m_hEdit,buf,MAX_PATH);
::ShowWindow(m_hEdit,SW_HIDE);
m_List.SetItemText(m_nItem,m_nSubItem,buf);
m_List.Invalidate();
::UpdateWindow(m_List.GetSafeHwnd());
m_bIsEdited=FALSE;
//*pResult = 0;
}