关闭

可编辑子项的CListCtrl类

228人阅读 评论(0) 收藏 举报

参考文章:http://www.vckbase.com/index.php/wv/1548

    ON_NOTIFY处理listControl消息,但此方法的report风格只有第一列能编辑


代码示例:

设置listcontrol属性Edit Labels为True

BEGIN_MESSAGE_MAP(CBoreEditDlg, CDialogEx)   
    ON_NOTIFY(NM_DBLCLK, IDC_LIST3, &CBoreEditDlg::OnDblclkList3)
    ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST3, &CBoreEditDlg::OnEndlabeleditList3)
END_MESSAGE_MAP()

void C***Dlg::OnDblclkList3(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    POSITION pos = m_list2.GetFirstSelectedItemPosition();
    int tIndex = m_list2.GetNextSelectedItem(pos);

    if ( tIndex >= 0 )
    {
        m_list2.SetFocus();
        CEdit* pEdit = m_list2.EditLabel( tIndex );
    }
}


void C***Dlg::OnEndlabeleditList3(NMHDR *pNMHDR, LRESULT *pResult)
{
    NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    *pResult = 0;
    CString pName = pDispInfo->item.pszText;
    int tIndex = pDispInfo->item.iItem;
    m_list2.SetFocus();

    if( ( ! pName.IsEmpty() ) && tIndex >= 0 ) 
        m_list2.SetItemText( tIndex, 0, pName); 
}


以下方法可实现对子项的修改

当你单击CListCtrl控件时,使其中的一行高亮显示。当你双击CListCtrl控件时,将一个CEdit(编辑框)控件移动到你所双击的列中(CEdit控件中显示你所单击列的内容)所在的位置。并使CEdit控件获取焦点。然后,你可以修改CEdit中的内容。当你的鼠标点击其他地方,CEdit将失去焦点,同时,我们将CEdit中的内容更新到CListCtrl中,从而完成了对CListCtrl的子项的修改。

首先在对话框中添加一个CEdit控件,并定义CEdit变量m_edit。当对话框初始化函数中隐藏该控件。
m_edit.ShowWindow(SW_HIDE);

然后对CListCtrl添加消息NM_DBLCLK(双击事件),在消息中添加代码


NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
    CRect rc;
    if(pNMListView->iItem!=-1)
    {
        m_row=pNMListView->iItem;//m_row为被选中行的行序号(int类型成员变量)
        m_column=pNMListView->iSubItem;//m_column为被选中行的列序号(int类型成员变量)
        if (m_edit.m_hWnd==NULL)
            m_edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,1002);
        m_edit.SetParent(&m_list);
        m_list.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子项的矩形       
        char * ch=new char [128];
        m_list.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//取得子项的内容
        m_edit.SetWindowText(ch);//将子项的内容显示到编辑框中
        m_edit.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),SWP_SHOWWINDOW);

        m_edit.SetFocus();//使编辑框取得焦点
        m_edit.CreateSolidCaret(1,rc.Height()-5);//创建一个光标
        m_edit.ShowCaret();//显示光标
        m_edit.SetSel(-1);//使光标移到最后面
    }
    *pResult = 0;

然后,添加CEdit失去焦点时的消息EN_KILLFOCUS。在该消息中添加代码使编辑框中的内容更新到CListCtrl中。

CString str;
    if(m_edit.m_hWnd!=NULL)
    {
        m_edit.GetWindowText(str);//取得编辑框的内容
        m_list.SetItemText(m_row,m_column,str);//将该内容更新到CListCtrl中
        m_edit.ShowWindow(SW_HIDE);//隐藏编辑框
    }


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:953次
    • 积分:32
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档