一个小问题,关于可编辑SubItemr的CListCtrl
采用子类化Edit控件,将其移动到命中的SubItem上方进行编辑的方法,但出了点小问题,主要代码如下:
void CFlashIO3Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMITEMACTIVATE *pLSV = (NMITEMACTIVATE*)pNMHDR;
if( (pLSV->iItem != -1) && (pLSV->iSubItem != 0) ) // 命中某子项
{
m_iItem = pLSV->iItem; // 保存命中子项的位置
m_iSubItem = pLSV->iSubItem;
m_lsvTest.EditLabel(m_iItem);
}
*pResult = 0;
}
void CFlashIO3Dlg::OnBeginlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pDispInfo->item.iItem != -1)
{
ASSERT(m_iItem == pDispInfo->item.iItem);
HWND hEdit = (HWND)m_lsvTest.SendMessage(LVM_GETEDITCONTROL);
ASSERT(hEdit != NULL);
VERIFY(m_edtSub.SubclassWindow(hEdit)); // 子类化控件
CRect rect; // 获取命中子项的坐标
m_lsvTest.GetSubItemRect(m_iItem, m_iSubItem, LVIR_BOUNDS, rect);
// m_edtSub为CSubEdit类对象
m_edtSub.m_x = rect.left + 2; // Edit将出现在命中SubItem的上方 m_edtSub.m_cx = rect.Width()-2;
// 将SubItem内容显示到Edit中供编辑
m_edtSub.SetWindowText(m_lsvTest.GetItemText(m_iItem, m_iSubItem));
*pResult = 0; // 允许编辑
}
else
{
*pResult = 1; // 禁止编辑
}
}
void CFlashIO3Dlg::OnEndlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pDispInfo->item.iItem != -1)
{
ASSERT(pDispInfo->item.iItem == m_iItem);
if(pDispInfo->item.pszText != NULL)
{ // 设置编辑结果至SubItem
m_lsvTest.SetItemText(m_iItem, m_iSubItem, pDispInfo->item.pszText);
m_edtSub.UnsubclassWindow();
*pResult = 0; // 恢复第0子项
}
}
else
{
*pResult = 1; // 将编辑应用于第0子项
}
m_iItem = -1;
m_iSubItem = -1;
}
void CSubEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
lpwndpos->x = m_x; // 移动Edit至SubItem处
lpwndpos->cx = m_cx;
CEdit::OnWindowPosChanging(lpwndpos);
// TODO: Add your message handler code here
}
现在的问题是当开始编辑SubItem(非0)时,SubItem 0 上的文字消失了,等编辑完成或取消后才恢复显示,我觉得这可能是Edit被移走后,SubItem 0没有重绘的原因吧,但不敢确定,请教高手这是为什么,该怎么解决呢?