MFC CListCtrl可编辑

CListCtrl 是一个经常使用的控件,通常用来显示数据库的内容。但是,CListCtrl并不好用。我们当然希望CListCtrl能像Excel那样好用,因此,得在原来的基础上进行改进。

一、使CListCtrl能够编辑子项

1、在对话框中添加一个CListCtrl控件,并添加CListCtrl类型的变量m_list。

2、初始化控件

设置控件风格(照抄网上的)

LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
m_list.SetExtendedStyle(dwStyle); //设置扩展风格

插入列

m_list.InsertColumn(0,"OrderID",LVCFMT_LEFT,80);
m_list.InsertColumn(1,"CustomerID",LVCFMT_LEFT,80);
m_list.InsertColumn(2,"OrderDate",LVCFMT_LEFT,80);
m_list.InsertColumn(3,"Feight",LVCFMT_LEFT,80);
m_list.InsertColumn(4,"ShipName",LVCFMT_LEFT,80);
m_list.InsertColumn(5,"ShipAddress",LVCFMT_LEFT,80);
m_list.InsertColumn(6,"ShipCountry",LVCFMT_LEFT,80);

插入行

   m_list.InsertItem(i,sOrderID);//sOrderID为插入的数据(LPCTSTR类型变量),i表示在数据在CListCtrl中的位置(int类型变量),以下类似
   m_list.SetItemText(i,1,sCustomerID);
   m_list.SetItemText(i,2,sOrderDate);
   m_list.SetItemText(i,3,sFeight);
   m_list.SetItemText(i,4,sShipName);
   m_list.SetItemText(i,5,sShipAddress);
   m_list.SetItemText(i,6,sShipCountry);

3、使CListCtrl可编辑

我采用的方法如下:当你单击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类型成员变量)
   m_list.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子项的矩形
   rc.left+=3;
   rc.top+=2;
   rc.right+=3;
   rc.bottom+=2;

   char * ch=new char [128];
   m_list.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//取得子项的内容
   m_edit.SetWindowText(ch);//将子项的内容显示到编辑框中
   m_edit.ShowWindow(SW_SHOW);//显示编辑框
   m_edit.MoveWindow(&rc);//将编辑框移动到子项上面,覆盖在子项上
   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;
m_edit.GetWindowText(str);//取得编辑框的内容
m_list.SetItemText(m_row,m_column,str);//将该内容更新到CListCtrl中
m_edit.ShowWindow(SW_HIDE);//隐藏编辑框

经过以上的步骤就实现的实现CListCtrl的子项可编辑。当然了,这还不完整。接下来所要做的工作:1、直接对CListCtrl派生出一个扩展类CListCtrlEx。2、添加自绘相关的代码。3、实现Virutal功能。4、继续添加双击子项弹出一个CComboBox控件的功能。5、可以调整行高。6、能够单击行头进行排序。等等等

一些别人写的比较好的东东

【1】http://www.codeproject.com/KB/list/virtuallist.aspx

【2】http://www.codeproject.com/KB/list/quicklist.aspx#text

【3】http://www.codeproject.com/KB/miscctrl/gridctrl.aspx#EditValidate

【4】http://www.chinaitpower.com/A/2004-02-14/132385.html

【5】http://m.cnblogs.com/35075/1556904.html

【6】http://www.vckbase.com/document/viewdoc/?id=1853

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC是Microsoft Foundation Classes的缩写,是微软为了简化Windows编程而开发的一套C++类库。ListCtrlMFC中的一个控件,用于显示和编辑数据的列表。 要在MFC中实现可编辑的ListCtrl控件,可以按照以下步骤进行操作: 1. 在对话框资源中添加一个ListCtrl控件,并设置其属性,如样式、列数等。可以使用控件向导来简化这一过程。 2. 在对话框类的头文件中声明一个ListCtrl对象,用于对控件进行操作。例如,在CDialog派生类中添加如下成员变量: ```cpp CListCtrl m_listCtrl; ``` 3. 在OnInitDialog函数中获取ListCtrl控件的指针,并进行初始化操作。例如: ```cpp m_listCtrl.SubclassDlgItem(IDC_LISTCTRL, this); //将控件与IDC_LISTCTRL关联起来 m_listCtrl.InsertColumn(0, _T("列1"), LVCFMT_LEFT, 100); //插入列 ``` 4. 通过ListCtrl对象的成员函数,可以实现对控件中的数据进行操作。例如,添加一行数据的代码如下: ```cpp m_listCtrl.InsertItem(0, _T("数据1")); //在第0行插入一行数据 m_listCtrl.SetItemText(0, 1, _T("数据2")); //设置第0行、第1列的数据 ``` 5. 若要实现可编辑功能,可以通过响应鼠标双击、单击或其他事件,在合适的位置进行编辑操作。例如,在双击某一项时弹出对话框进行编辑: ```cpp int index = m_listCtrl.GetSelectionMark(); //获取当前选中的项 CString data = m_listCtrl.GetItemText(index, 1); //获取选中项的数据 CEditDialog editDlg; //自定义的对话框类 editDlg.m_editCtrl.SetWindowText(data); //将数据显示在对话框的编辑框中 if (editDlg.DoModal() == IDOK) { CString newData; editDlg.m_editCtrl.GetWindowText(newData); //获取对话框中编辑框的数据 m_listCtrl.SetItemText(index, 1, newData); //更新ListCtrl控件中的数据 } ``` 通过以上步骤,就可以实现在MFC中可编辑的ListCtrl控件。需要注意的是,在实际应用过程中可能还需要处理其他事件、进行数据校验等操作,具体实现可根据需求进行扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值