c++ MFC 如何实现在List Control中编辑单元格数据

 c++中如何编辑单元格中的数据,有以下步骤:

1)在资源视图对话框中>>拖放一个List Control控件>>添加变量

public:
   CListCtrl ParaList;//显示数据的list列表变量

2)头文件添加两个变量

CMFCMaskedEdit* pCurEdit;
CMFCMaskedEdit m_Edit_Value;

pCurEdit在构造函数中进行初始化 pCurEdit = NULL,m_Edit_Value在 OnInitDialog( ) 中进行如下初始化

//字体设置

CFont m_font;//头文件声明
m_font.CreatePointFont(80, _T("Arial"));

//m_Edit_Value初始化

m_Edit_Value.CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"), NULL, WS_CHILD|ES_CENTER, CRect(0,0,1,1), this, 1);

m_Edit_Value.SetParent(&ParaList);
m_Edit_Value.SetFont(&m_font, FALSE);

3)在List Control控件双击事件中,pCurEdit替代m_Edit_Value操作,把选中单元格的数据赋给pCurEdit,pCurEdit移动到合适位置显示,此时,pCurEdit获得输入焦点,可进行编辑数据,代码如下:

void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码

    NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;

    if(pNMListView->iItem!=-1)
    {
        m_nRow=pNMListView->iItem;//m_row为被选中行的行序号
        m_nCol=pNMListView->iSubItem;//m_col为被选中行的列序号
        if((m_nCol==0))
        {
            return;	//第一列不选中
        }

        CRect rcItem;
        ParaList.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem, LVIR_LABEL, rcItem);//取得子项的矩形
        CString text = ParaList.GetItemText(m_nRow, m_nCol);//取得子项的内容

        rcItem.top += 1;
        rcItem.bottom += 1;
        rcItem.left += 3;
        rcItem.right -= 3;

        pCurEdit = &m_Edit_Value;
        pCurEdit->SetWindowText(text);//将子项的内容显示到编辑框中
        CRect rect;
        pCurEdit->MoveWindow(&rcItem);//将编辑框移动到子项上面,覆盖在子项上
        pCurEdit->ShowWindow(SW_SHOW);//显示编辑框
        pCurEdit->SetFocus();        //使编辑框取得焦点
        pCurEdit->SetSel(0, -1);      //使光标移到最后面
    }

    *pResult = 0;
}

4)在List Control控件NM_SETFOCUS事件中,把pCurEdit变量中的值设置给ParaList,m_Edit_Value隐藏,最终实现控件单元格数据的编辑,代码如下:

void OnNMSetfocusList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    if (pCurEdit!=NULL)
    {
        if(pCurEdit->IsWindowVisible())
        {
            //传递edit值到控件
            CString str;
            pCurEdit->GetWindowText(str);
            ParaList.SetItemText(m_nRow,m_nCol,str);
        }
    }
    m_Edit_Value.ShowWindow(SW_HIDE);

    *pResult = 0;
}


   

 

你可能感兴趣的:(c++)