Editing listview subitems using LVM_GETEDITCONTROL

 

This artical suggests yet another way to edit subitems in CListView or CListCtrl. It uses LVM_GETEDITCONTROL message to return the handle of the actual edit control used by MFC and then subclasses the handle in order to re-postition the control over the subitem you wish to edit. The sample download program was written using MSVC 5.0 and includes a class called CListEditView, derived from CListView. The code can be modified to use CListCtrl as well. CListEditView::DrawItem(LPDRAWITEMSTRUCT lpDIS) is the slightly modified version taken from the ROWLIST example provided by MSVC 5.0. To use CListEditView in your project, just include the source and header files, and derive your list view class from CListEditView. Please feel free to modify the code as you see fit. Basically, it works as follows: When the handler for LVN_BEGINLABELEDIT is called, the handler locates the subitem from the current mouse position. It then retrieves the handle to the edit control, subclasses the control to a CEdit object and repositions the control over the location of the subitem. The subclassed CEdit object has the ON_WM_WINDOWPOSCHANGING handler overridden to use the coordinates of location of the subitem because it will try to reposition itself over the LABEL of the listview, when it becomes visible. When finished editing, the LVN_ENDLABELEDIT handler is called and if the operation was not aborted (by pressing ESC for example), the handler sets the subitem text to the contents in the edit control. I've included the source code for these two handlers below.

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

Download demo project - 42 KB

Download source - 4 KB



Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Although much publicity around computer security points to hackers and other outside attacks, insider threats can be particularly insidious and dangerous, whether caused by malice or employee negligence. In this report, you learn the eight most significant cybersecurity threats that could impact your organization (at any time), Forbes cited internal threats as No. 3, noting that internal attacks can be "the most devastating" due to the amount of damage privileged users can inflict and the type of data they can …

  • Intelligent N+X Redundancy, Placement Affinities, & Future Proofing in the Virtualized Data Center Virtualization brought about the ability to simplify business continuity management in IT. Workload portability and data replication capabilities mean that physical infrastructure failures no longer need impact application services, and they can rapidly be recovered even in the event of complete site failure. However, Enterprises and Service Providers face new challenges ensuring they have enough compute …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date