C/C++/MFC
List Controls listview edit 가능하게
2007.10.11 13:55
// Attributes
protected:
int m_cx;
BOOL m_nEdit;
CLVEdit m_LVEdit;
void CListEditView::OnBeginLabelEdit(NMHDR* pNMHDR,LRESULT* pResult)
{
LV_DISPINFO* pDispInfo=(LV_DISPINFO*)pNMHDR;
*pResult=1;
CPoint posMouse;
GetCursorPos(&posMouse);
ScreenToClient(&posMouse);
LV_COLUMN lvc;
lvc.mask=LVCF_WIDTH;
CRect rcItem;
GetListCtrl().GetItemRect(pDispInfo->item.iItem,rcItem,LVIR_LABEL);
if(rcItem.PtInRect(posMouse))
m_nEdit=0;
int nCol=1;
while(m_nEdit==-1 && GetListCtrl().GetColumn(nCol,&lvc))
{
rcItem.left=rcItem.right;
rcItem.right+=lvc.cx;
if(rcItem.PtInRect(posMouse))
m_nEdit=nCol;
nCol++;
}
if(m_nEdit==-1)
return;
HWND hWnd=(HWND)SendMessage(LVM_GETEDITCONTROL);
ASSERT(hWnd!=NULL);
VERIFY(m_LVEdit.SubclassWindow(hWnd));
m_LVEdit.m_x=rcItem.left;
m_LVEdit.m_y=rcItem.top-1;
m_LVEdit.SetWindowText(GetListCtrl().GetItemText(pDispInfo->item.iItem,m_nEdit));
*pResult=0;
}
void CListEditView::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo=(LV_DISPINFO*)pNMHDR;
CString sEdit=pDispInfo->item.pszText;
if(!sEdit.IsEmpty())
{
GetListCtrl().SetItemText(pDispInfo->item.iItem,m_nEdit,sEdit);
}
m_nEdit=-1;
VERIFY(m_LVEdit.UnsubclassWindow()!= NULL);
GetListCtrl().SetItemState(pDispInfo->item.iItem,0,LVNI_FOCUSED|LVNI_SELECTED);
*pResult=0;
}