메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

C/C++/MFC

List Controls listview edit 가능하게

2007.10.11 13:55

WhiteAT 조회 수:14105

// 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;
}